1、K近鄰算法(K-nearest neighbor)python
算法:
輸入:
$T = { (x_{1},y_{1}),(x_{2},y_{2}),..,(x_{n},y_{n})}$
其中,$x_{i} \in X \subseteq R^{n}$爲特徵向量,$y_{i} \in Y ={c_{1},c_{2},..,c_{k}}$爲類別,$i=1,2,3,..,N$;實例x
輸出:x所屬類別y
(1). 根據距離度量,在訓練集T中找出與$x$最近鄰的$k$個點,涵蓋這$k$個點的鄰域爲$N_{k}(x)$
(2). 在$N_{k}(x)$中根據分類決策規則(如多數表決)決定$x$的類別$y$:
$y = argmax_{c_{j}} \sum_{x_{i} \in N_{k}(x)} I(y_{i} = c_{j}),i=1,2,..,M;j=1,2,..,K$
其中$I$爲指示函數,即當$y_{i} = c_{j}$時$I$爲1,不然$I$爲0。算法
import numpy as np class KNN: def __init__(self,X,Y,k): self.K = k self.X = X self.Y = Y def predict(self,x): num_samples,feat_dim = self.X.shape dist = np.zeros((num_samples)) for n in range(num_samples): dist[n] = self.__calc_dist(X[n,:],x) nsmallest_idx = self.__nsmallest(dist,self.K) rsp = [self.Y[k] for k in nsmallest_idx] yset = list(set(rsp)) return yset[np.array([rsp.count(i) for i in yset]).argmax()] def __calc_dist(self,x1,x2): return np.sum((x1-x2)**2) def __nsmallest(self,x,n): return x.argsort()[0:n]
例2.貸款申請樣本數據表函數
ID | 年齡 | 有工做 | 有本身的房子 | 信貸狀況 | 類別 |
---|---|---|---|---|---|
1 | 青年 | 否 | 否 | 通常 | 否 |
2 | 青年 | 否 | 否 | 好 | 否 |
3 | 青年 | 是 | 否 | 好 | 是 |
4 | 青年 | 是 | 是 | 通常 | 是 |
5 | 青年 | 否 | 否 | 通常 | 否 |
6 | 中年 | 否 | 否 | 通常 | 否 |
7 | 中年 | 否 | 否 | 好 | 否 |
8 | 中年 | 是 | 是 | 好 | 否 |
9 | 中年 | 否 | 是 | 很是好 | 是 |
10 | 中年 | 否 | 是 | 很是好 | 是 |
11 | 老年 | 否 | 是 | 很是好 | 是 |
12 | 老年 | 否 | 是 | 好 | 是 |
13 | 老年 | 是 | 否 | 好 | 是 |
14 | 老年 | 是 | 否 | 很是好 | 是 |
15 | 老年 | 否 | 否 | 通常 | 否 |
試預測:$x = (老年,是,否,通常,是)$ 是否發放貸款rest
X = np.array([[1,0,0,0,0,1,0,0,0],[1,0,0,0,0,0,1,0,0],[1,0,0,1,0,0,1,0,1], [1,0,0,1,1,1,0,0,1],[1,0,0,0,0,1,0,0,0],[0,1,0,0,0,1,0,0,0], [0,1,0,0,0,0,1,0,0],[0,1,0,1,1,0,1,0,0],[0,1,0,0,1,0,0,1,1], [0,1,0,0,1,0,0,1,1],[0,0,1,0,1,0,0,1,1],[0,0,1,0,1,0,1,0,1], [0,0,1,1,0,0,1,0,1],[0,0,1,1,0,0,0,1,1],[0,0,1,0,0,1,0,0,0]]) Y = np.array([0,0,1,1,0,0,0,1,1,1,1,1,1,1,0]) x = np.array([[0,0,1,1,0,1,0,0,1]]) clf = KNN(X,Y,3) print clf.predict(x)
1