KNN

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
相關文章
相關標籤/搜索