機器學習 KNN演算法

2021-09-25 21:27:30 字數 3179 閱讀 1408

knn(k-nearest neighbor)k-近鄰演算法,簡單的說,該演算法就是採用測量不同特徵值之間的距離方法進行分類。

knn的工作原理

存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。

輸入本有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取出樣本集中特徵最相似資料(最近鄰)的分類標籤。一般來說,我們只選擇樣本資料集中前k個最相似的資料,通常k是不大於20的整數。最後,選擇k個最相似資料**現次數最多的分類,作為新資料的分類。

優點:精度高,對異常值不敏感、無資料輸入假定

缺點:計算複雜度高,空間複雜度高。

適用資料範圍:數值型和標稱型

k-近鄰演算法的一般流程:

收集資料:可以使用任何方法。

準備資料:距離計算所需要的數值,最好是結構化的資料格式。

分析資料:可以使用任何方法。

訓練演算法:此步驟不適用於k-近鄰演算法。

測試演算法:計算錯誤率。

使用演算法:首先需要輸入樣本資料和結構化的輸出結果,然後執行k-近鄰演算法判定輸入資料分別屬於哪個分類,最後應用對計算出的分類執行後續的處理。

如何求距離

歐氏距離公式

二維空間:

多維空間:

下面通過乙個例項對knn演算法有乙個更加深刻的了解

電影的分類案例

我們知道電影的分類有好多種,比如說動作,愛情,喜劇,災難…它們是依據什麼進行分類的呢。比如說愛情電影就是在影片**現較多的接吻鏡頭,在動作類電影**現了較多的打鬥類鏡頭。

如下圖所示電影中的接吻鏡頭和打鬥鏡頭的次數的分類圖:

可以看到,距離較近的那幾個可以分為一類,因為他們有相同的特徵。那麼我們就基於這個原理,用knn演算法可以對乙個電影進行分類,

下面我們就利用knn演算法編寫**,對上面表中的最後乙個電影進行分類,具體**如下:

from numpy import

*def

createdataset()

:# group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])

# labels = ['a', 'a', 'b', 'b']

group = array([[

3,104],[

2,100],[

1,81]

,[101,10]

,[99,

5],[

98,2]

])labels =

['roman'

,'roman'

,'roman'

,'action'

,'action'

,'action'

]return group, labels

defclassify

(inx, dataset, labels, k)

:# shape:輸出陣列的格式

datasetsize = dataset.shape[0]

# (6,2)

# tile複製陣列 e.g. [0,1], tile([0,1], (3,1)) -> [[0,1],[0,1],[0,1]]

diffmat = tile(inx,

(datasetsize,1)

)- dataset

sqdiffmat = diffmat **

2# print(sqdiffmat)

# axis表示需要加和的維度

sqdistances = sqdiffmat.

sum(axis=1)

# print(sqdistances)

distances = sqdistances **

0.5# print(distances)

# sorteddistindicies 是乙個排好序的index

sorteddistindicies = distances.argsort(

)# print(sorteddistindicies)

classcount =

for i in

range

(k):

voteilabel = labels[sorteddistindicies[i]

]# print(voteilabel)

# get是乙個字典dict的方法,它的作用是返回key對應的value值,如果沒有的話,返回預設值,就是下一行的0

classcount[voteilabel]

= classcount.get(voteilabel,0)

+1# print(classcount)

# sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)

sortedclasscount =

sorted

(classcount.items(

), key=

lambda d:

float

(d[1])

, reverse=

true

)print

(sortedclasscount)

return sortedclasscount

if __name__ ==

'__main__'

: group, labels = createdataset(

) result = classify([18

,90], group, labels,

3)

輸出結果如下:

可見,將最後乙個電影分到了愛情片裡面,因為它的接吻鏡頭比打鬥鏡頭多的多,所以分類也是正確的。

機器學習 演算法 KNN

參考 我感覺knn是最簡單的乙個機器學習演算法,實現很簡單,效果也一般般 就是算個euclideam distance,還有一些可以優化的地方,比如可以加權,第二篇文章提到了 python 如下 coding utf 8 created on aug 30,2013 author blacklaw ...

機器學習 KNN 演算法

一 主要目的 在樣本空間中,找到與待估計的樣本最臨近的k個鄰居,用這幾個鄰居的類別來估計待測樣本的類別 二 適用性 樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分。尤其適用於樣本分類邊界不規則的情況 三 不足 1 當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙...

機器學習 KNN演算法

一 近 鄰 算 法 knn 原理 工 作 原 理 是 存 在 一 個 樣 本 資料 集 合 也 稱 作 訓練 樣 本 集 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 輸 人 沒 有 標 籤 的 新 ...