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 原理 工 作 原 理 是 存 在 一 個 樣 本 資料 集 合 也 稱 作 訓練 樣 本 集 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 輸 人 沒 有 標 籤 的 新 ...