最基礎的分類算法-k近鄰算法 kNN簡介及Jupyter基礎實現及Python實現

k-Nearest Neighbors簡介

對於該圖來講,x軸對應的是腫瘤的大小,y軸對應的是時間,藍色樣本表示惡性腫瘤,紅色樣本表示良性腫瘤,咱們先假設k=3,這個k先不考慮怎麼獲得,先假設這個k是經過程序員經驗獲得。程序員

 

假設此時來了一個新的樣本綠色,咱們須要預測該樣本的數據是良性仍是惡性腫瘤。咱們從訓練樣本中選擇k=3個離新綠色樣本最近的樣本,以選取的樣本點本身的結果進行投票,如圖投票結果爲藍色:紅色=3:0,因此預測綠色樣本可能也是惡性腫瘤。算法

再好比app

 

此時來了一個新樣本,咱們選取離該樣本最近的三個樣本點,根據他們自身的結果進行投票,如圖獲得藍色:紅色=1:2,那麼咱們能夠預測該綠色樣本可能也是良性腫瘤。spa

基礎代碼實現

 

 1 #首先導入代碼須要的package
 2 import numpy as np  3 import matplotlib  4 import matplotlib.pyplot as plt  5 #此處先使用咱們模擬的數據進行算法的入門模擬
 6 #特徵點的集合
 7 raw_data_X = [[3.393533211, 2.331273381],  8               [3.110073483, 1.781539638],  9               [1.343808831, 3.368360954], 10               [3.582294042, 4.679179110], 11               [2.280362439, 2.866990263], 12               [7.423436942, 4.696522875], 13               [5.745051997, 3.533989803], 14               [9.172168622, 2.511101045], 15               [7.792783481, 3.424088941], 16               [7.939820817, 0.791637231] 17  ] 18 #0就表明良性腫瘤,1就表明惡性腫瘤
19 raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] 20 #咱們使用raw_data_X和raw_data_y做爲咱們的訓練集
21 X_train = np.array(raw_data_X) #訓練數據集的特徵 22 Y_train = np.array(raw_data_y) #訓練數據集的結果(標籤) 23 #此時能夠查看兩個訓練集數據輸出顯示
24 In[1]: X_train 25 '''
26 Out [1]:array([[3.39353321, 2.33127338], 27  [3.11007348, 1.78153964], 28  [1.34380883, 3.36836095], 29  [3.58229404, 4.67917911], 30  [2.28036244, 2.86699026], 31  [7.42343694, 4.69652288], 32  [5.745052 , 3.5339898 ], 33  [9.17216862, 2.51110105], 34  [7.79278348, 3.42408894], 35  [7.93982082, 0.79163723]]) 36 '''
37 In[2]: Y_train 38 '''
39 Out[2]:array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) 40 '''
41 #咱們能夠嘗試繪製原訓練集的散點圖
42 plt.scatter(X_train[Y_train == 0, 0],X_train[Y_train == 0,1], color = "red") 43 plt.scatter(X_train[Y_train == 1, 0],X_train[Y_train == 1,1], color = "blue") 44 plt.show() #顯示該散點圖

 

 

訓練集繪製的散點圖如上圖所示,紅色的散點表示爲良性腫瘤的樣本,藍色表示爲惡性腫瘤的樣本rest

1 #此時,來了一個新樣本數據 x 
2 x = np.array([8.093607318,3.365731514]) 3 #將新來的樣本點繪入圖像中,先繪製原訓練集散點圖像,再使用綠色表示新樣本點進行繪製
4 plt.plot(X_train[Y_train == 0, 0],X_train[Y_train == 0, 1], color = "red") 5 plt.plot(X_train[Y_train == 1, 0],X_train[Y_train == 1, 1], color = "blue") 6 plt.plot(x[0],x[1], color = "green") 7 plt.show()

帶新樣本點繪製的散點圖如上圖所示code

1 #此時咱們假設根據程序員經驗選取 k = 6
2 k = 6
3 #而後咱們須要進行在原訓練集中選取k個離新樣本點最近的6個樣本點
4 #兩點之間的距離使用歐拉公式進行計算,

 

 1 #因此根據上圖公式咱們能夠進行計算全部訓練集的樣本點與新的綠色樣本點的距離
 2 #此處須要使用到開平方根,因此導入相應package
 3 from math import sqrt  4 #使用distances進行存儲全部距離值
 5 distances = []  6 # 由於全部的訓練集的X Y 信息都存儲在X_train中,因此咱們使用for循環進行遍歷全部的樣本點信息進行計算
 7 for x_train in X_train:  8     #使用d暫存距離
 9     d = sqrt(np.sum((x_train - x) ** 2)) 10     #使用append將距離d存到distances
11  distances.append(d) 12 #上面for循環部分也可以使用列表推導式進行簡化代碼
13 distances = [sqrt(np.sum((X_train - x) ** 2)) for x_train in X_train] 14 #此時咱們可以輸出distances的值進行查看一下
15 In[3]: distances 16 Out[3]: [4.812566907609877, 17  5.229270827235305, 18  6.749798999160064, 19  4.6986266144110695, 20  5.83460014556857, 21  1.4900114024329525, 22  2.354574897431513, 23  1.3761132675144652, 24  0.3064319992975, 25  2.5786840957478887] 26 #此時咱們的distances裏面存儲全部的訓練樣本點與新樣本點的距離
27 #由於咱們須要找到距離新樣本點最近的k(此處k=6)個樣本點,全部咱們須要對distances進行排序
28 #此處咱們使用np.argsort對其進行值的索引的排序,就不會對其值邏輯位置進行影響,使用nearest存儲排序後的結果
29 nearest = np.argsort(distances) 30 #找到前6個索引對應的值對應的Y_train的值
31 topk_y = [Y_train[i] for i in nearest[:k]] 32 #此時咱們輸出topk_y的值
33 In[4]: topk_y 34 Out[4]:[1, 1, 1, 1, 1, 0] 35 #咱們可以看到此時對應的topk_y中存儲着離新樣本點最近的k個訓練樣本點的結果(0/1 良性腫瘤/惡性腫瘤)
36 #而後咱們對結果進行「投票」操做,票數最多的結果做爲新樣本的預測結果(前面已經介紹)
37 #能夠調用Collections包中的Counter方法對topk_y進行唱票統計
38 from Collections import Counter 39 votes = Counter(topk_y) 40 #此時咱們可以輸出votes的值進行查看
41 In[4]: votes 42 Out[4]: Counter({1: 5, 0: 1}) 43 #咱們可以使用most_common(vaule)方法進行取最大票數的前value位
44 In[5]: votes.most_common(1) 45 Out[5]: [(1, 5)] 46 #查看該輸出咱們可以獲得
47 predict_y = votes.most_common(1)[0][0] 48 In[6]: predict_y 49 Out[6]: 1
50 #此時kNN算法結束,根據所獲得的預測結果,咱們可以預測該新的樣本多是惡性腫瘤

 

 Python實現

 1 import numpy as np  2 from math import sqrt  3 from collections import Counter  4 
 5 def kNN_classify(k, X_train, Y_train, x):  6     assert 1<= k <= X_train.shape[0],"k must be valid"
 7     assert X_train.shape[0] == Y_train.shape[0], "the size of X-train must equal to the size of Y_train"
 9     assert X_train.shape[1] == x.shape[0], "the feature number of x must be equal to X_train"
11 
12     distances = [sqrt(np.sum((X_train - x) ** 2)) for x_train in X_train] 13     nearest = np.argsort(distances) 14 
15     topk_y = [Y_train[i] for i in nearest[:k]] 16     votes = Counter(topk_y) 17 
18     return votes.most_common(1)[0][0]
相關文章
相關標籤/搜索