knn(k-nearest neighbor)工作原理:存在乙個樣本資料集合,也稱為訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類對應的關係。輸入沒有標籤的資料後,將新資料中的每個特徵與樣本集中資料對應的特徵進行比較,提取出樣本集中特徵最相似資料(最近鄰)的分類標籤。一般來說,我們只選擇樣本資料集中前k個最相似的資料,這就是k近鄰演算法中k的出處,通常k是不大於20的整數。最後選擇k個最相似資料**現次數最多的分類作為新資料的分類。
說明:knn沒有顯示的訓練過程,它是「懶惰學習」的代表,它在訓練階段只是把資料儲存下來,訓練時間開銷為0,等收到測試樣本後進行處理。
優點: 缺點:
如果訓練集有m個樣本,n個特徵,則**每乙個新的資料,需要o(m*n)
優化:使用樹結構:kd-tree, ball-tree
隨著維數的增加,看似兩個距離非常近的點,距離會越來越大。所以knn不適合高維度的資料,解決方法:pca 降維處理
現有十組腫瘤資料,raw_data_x 分別是腫瘤大小和腫瘤時間,raw_data_y代表的是 良性腫瘤和惡性腫瘤,x代表的是測試資料,並用藍色區分,我們需要通過knn演算法判斷其實良性腫瘤還是惡性腫瘤。通過matplotlib繪製散點圖如下:
import numpy as np
import matplotlib.pyplot as plt
raw_data_x = [[3.393533211,2.331273381],
[3.110073483,1.781539638],
[1.343808831,3.368360954],
[3.582294042,4.679179110],
[2.280362439,2.866990263],
[7.423436942,4.696522875],
[5.745051997,3.533989803],
[9.172168622,2.511101045],
[7.792783481,3.424088941],
[7.939820817,0.791637231]]
raw_data_y = [0,0,0,0,0,1,1,1,1,1]
x = np.array([8.093607318,3.365731514])
x_train = np.array(raw_data_x)
y_train = np.array(raw_data_y)
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r')
plt.scatter(x[0],x[1],color='b')
plt.show()
執行結果:
上圖中 綠色為良性腫瘤,紅色為惡性腫瘤,藍色為需要判斷的樣本。
整體思路為:
1、計算每個樣本與藍點的距離
2、將計算出來的距離進行排序
3、取出前k個樣本
4、統計前k個樣本**現頻率最多的種類
5、輸出判斷結果
說明:這裡的距離指得是 明可夫斯基距離
根據以上思路,可以編寫一下**:
import執行結果:numpy as np
import
matplotlib.pyplot as plt
raw_data_x = [[3.393533211,2.331273381],
[3.110073483,1.781539638],
[1.343808831,3.368360954],
[3.582294042,4.679179110],
[2.280362439,2.866990263],
[7.423436942,4.696522875],
[5.745051997,3.533989803],
[9.172168622,2.511101045],
[7.792783481,3.424088941],
[7.939820817,0.791637231]]
raw_data_y = [0,0,0,0,0,1,1,1,1,1]
x = np.array([8.093607318,3.365731514])
x_train =np.array(raw_data_x)
y_train =np.array(raw_data_y)
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g'
)plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r'
)plt.scatter(x[0],x[1],color='b'
)plt.show()
#在原有基礎上新增以下**
from math import
sqrt
from collections import
counter
#計算每個樣本到目標的距離
distances = [sqrt(np.sum((e-x)**2)) for e in
x_train]
#將計算的距離進行排序,並返回對應的索引
nearest =np.argsort(distances)
#取前6個樣本
k = 6
#將最近的k個樣本取出來,topk_y 中為樣本種類
topk_y = [y_train[i] for i in
nearest[:k]]
#統計topk_y中的種類和數量
votes =counter(topk_y)
#獲取最多數量的樣本
votes.most_common(1)
#獲取最多樣本的種類
predict_y = votes.most_common(1)[0][0]
print("腫瘤型別:",predict_y)
腫瘤型別: 1有了以上的基礎,使用scikit-learn中的knn應該就比較容易了。以上就是通過knn演算法進行型別判斷的簡易過程。
from sklearn.neighbors import需要詳細描述,檢視 官方文件kneighborsclassifier
import
numpy as np
import
matplotlib.pyplot as plt
raw_data_x = [[3.393533211,2.331273381],
[3.110073483,1.781539638],
[1.343808831,3.368360954],
[3.582294042,4.679179110],
[2.280362439,2.866990263],
[7.423436942,4.696522875],
[5.745051997,3.533989803],
[9.172168622,2.511101045],
[7.792783481,3.424088941],
[7.939820817,0.791637231]]
raw_data_y = [0,0,0,0,0,1,1,1,1,1]
x_train =np.array(raw_data_x)
y_train =np.array(raw_data_y)
x = np.array([8.093607318,3.365731514])
#生成乙個k為6 knn的物件
knn_classifier = kneighborsclassifier(n_neighbors=6)
#將訓練資料寫入
knn_classifier.fit(x_train,y_train)
#**資料
y_predict = knn_classifier.predict(x.reshape(1,-1))
#輸出**結果
print(y_predict )
posted @
2018-06-07 10:00
饕客 閱讀(
...)
編輯收藏
機器學習之K近鄰演算法 kNN 1
可以說knn是機器學習中非常特殊的沒有模型的演算法,為了和其他演算法統一,可以認為新聯資料集就是模型本身 import numpy as np import matplotlib.pyplot as plt from math import sqrt from collections import ...
機器學習演算法(1) KNN
k nearest neighbor algorithm 右圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k 3,由於紅色三角形所佔比例為2 3,綠色圓將被賦予紅色三角形那個類,如果k 5,由於藍色四方形比例為3 5,因此綠色圓被賦予藍色四方形類。k最近鄰 k nearest ne...
機器學習 KNN
posted on 2015 05 21 20 34 in ml 0 comment views 3195 原始碼 決策樹和基於規則的分類器都是積極學習方法 eager learner 的例子,因為一旦訓練資料可用,他們就開始學習從輸入屬性到類標號的對映模型。乙個相反的策略是推遲對訓練資料的建模,直...