## 2 Preliminaries  
### Case-Based Reasoning  
Case-based reasoning learns from experience. A reasoner uses old experience to suggest solutions for new problems [10]. Specifically, the reasoner solves new problems by recording and reusing the most similar one or one set [11,12]. It interprets new situations by remembering old similar situations and contrasting the new one to old ones to see which one fits best. Case-based reasoning could be used as the diagnostic assistant to help users diagnose problems on their computer systems [13]. When a user describes his problems, the closest cases in the case base will be retrieved. The diagnostic system can recommend some of these to the user, adapting each case to each user's particular situation, such as changing recommendations based on what operating system the user has, what software the user uses,what internet connection method they choose, and the printer brand. If none of the cases is suitable, some other problem-solving method can be done to solve the problem, perhaps by having a human help diagnose the problem. When the problem is finally fixed, the case would be added to the case base. Case-based reasoning is a method that combines learning with reasoning. In case-based learning, the training samples, the cases, are stored and accessed to solve a new problem [14, 15]. It is very important to find a way to represent the data. To trigger this method, a distance is required to measures the closeness of two examples. Suppose \(e(X_{i})\) (shown in Table 1) is the value of feature \(X_{i}\) for the example \(e\); \((e_{1}(X_{i})-e_{2}(X_{i}))\) is the feature difference between example \(e_{1}\) and example \(e_{2}\). The Euclidean metric can be used as the distance between two objects and can be calculated as the square root of the sum of the squares of the feature differences. One issue is the importance of different features; increasing the weight of one feature increases the importance of that feature. Let \(w_{i}\) be a non-negative real-valued parameter that specifies the weight of feature \(X_{i}\). The distance between examples \(e_{1}\) and \(e_{2}\) is then \(d(e_{1}\),\(e_{2})=sqrt(\sum_{i}w_{i}\times(e_{1}(X_{i})-e_{2}(X_{i}))^{2})\). The feature weights can be provided as input. After the situations or cases are properly represented and stored, the new situation (case) will enter into the system memory that is used for reasoning for the next time. In case-based reasoning, to get a prediction for a new case, we choose the case that is similar, or close to, the new case to predict the value of the target features of the new case. In general, the second time solving the problem is easier than the first because we are more competent since we remember our mistakes and, therefore, can avoid them. A case-based reasoning algorithm to predict whether the user will or will not read this article must determine the relative importance of the dimensions. One of the problems in case-based reasoning is accessing the relevant cases. To finish this work as quickly as possible, a _kd_-tree [16] is a way to number the training examples so that chosen examples can be found quickly. Just like a decision tree, a _kd_-tree splits on input features. In building a _kd_-tree from a set of examples, the learner tries to find a suitable feature that can split the examples into several sets that have approximately equal size, then builds sub-_kd_-trees for the cases in each partition. The exact matches will be found at the leaf. Case-based reasoning can be expressed as a four-step process shown in Figure 1[17]. Figure 1: Case-based learning process. **Retrieve:** Remembering is the process of retrieving a case or set of cases from memory. In general, it consists of two sub-steps: _recall_ previous cases and _select_ the best case. The goal of the first step is to retrieve suitable cases that can support reasoning that occurs in the following step. Good cases are those that have the potential ability to make a correct prediction on the new case.