機器學習 kNN(1)

2021-09-11 08:15:28 字數 4288 閱讀 9728

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

以上就是通過knn演算法進行型別判斷的簡易過程。

有了以上的基礎,使用scikit-learn中的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 的例子,因為一旦訓練資料可用,他們就開始學習從輸入屬性到類標號的對映模型。乙個相反的策略是推遲對訓練資料的建模,直...