機器學習 KNN(Python)

2021-08-22 16:22:48 字數 2537 閱讀 2605

鄰近演算法(k-nearestneighbor) 是機器學習中的一種分類(classification)演算法,也是機器學習中最簡單的演算法之一了。雖然很簡單,但在解決特定問題時卻能發揮很好的效果。因此,學習knn演算法是機器學習入門的乙個很好的途徑。

knn演算法的思想非常的樸素,它選取k個離測試點最近的樣本點,輸出在這k個樣本點中數量最多的標籤(label)。我們假設每乙個樣本有m個特徵值(property),則乙個樣本的可以用乙個m維向量表示: x =( x1,x2,... , xm ),  同樣地,測試點的特徵值也可表示成:y =( y1,y2,... , ym )。那我們怎麼定義這兩者之間的「距離」呢?

在二維空間中,有:d2 = ( x1 - y1 )2 + ( x2 - y2 )2 ,  在三維空間中,兩點的距離被定義為:d2 = ( x1 - y1 )2 + ( x2 - y2 )2  + ( x3 - y3 )2 。我們可以據此推廣到m維空間中,定義m維空間的距離:d2 = ( x1 - y1 )2 + ( x2 - y2 )2  + ...... + ( xm - ym )2 。要實現knn演算法,我們只需要計算出每乙個樣本點與測試點的距離,選取距離最近的k個樣本,獲取他們的標籤(label) ,然後找出k個樣本中數量最多的標籤,返回該標籤。

在開始實現演算法之前,我們要考慮乙個問題,不同特徵的特徵值範圍可能有很大的差別,例如,我們要分辨乙個人的性別,乙個女生的身高是1.70m,體重是60kg,乙個男生的身高是1.80m,體重是70kg,而乙個未知性別的人的身高是1.81m, 體重是64kg,這個人與女生資料點的「距離」的平方 d2 = ( 1.70 - 1.81 )2 + ( 60 - 64 )2 = 0.0121 + 16.0 = 16.0121,而與男生資料點的「距離」的平方d2 = ( 1.80 - 1.81 )2 + ( 70 - 64 )2 = 0.0001 + 36.0 = 36.0001 。可見,在這種情況下,身高差的平方相對於體重差的平方基本可以忽略不計,但是身高對於辨別性別來說是十分重要的。為了解決這個問題,就需要將資料標準化(normalize),把每乙個特徵值除以該特徵的範圍,保證標準化後每乙個特徵值都在0~1之間。我們寫乙個normdata函式來執行標準化資料集的工作:

1 def normdata(dataset):

2 maxvals = dataset.max(axis=0)

3 minvals = dataset.min(axis=0)

4 ranges = maxvals - minvals

5 retdata = (dataset - minvals) / ranges

6 return retdata, ranges, minvals

然後開始實現knn演算法:

1 def knn(dataset, labels, testdata, k):

2 distsquaremat = (dataset - testdata) ** 2 # 計算差值的平方

3 distsquaresums = distsquaremat.sum(axis=1) # 求每一行的差值平方和

4 distances = distsquaresums ** 0.5 # 開根號,得出每個樣本到測試點的距離

5 sortedindices = distances.argsort() # 排序,得到排序後的下標

6 indices = sortedindices[:k] # 取最小的k個

7 labelcount = {} # 儲存每個label的出現次數

8 for i in indices:

9 label = labels[i]

10 labelcount[label] = labelcount.get(label, 0) + 1 # 次數加一

11 sortedcount = sorted(labelcount.items(), key=opt.itemgetter(1), reverse=true)

12 # 對label出現的次數從大到小進行排序

13 return sortedcount[0][0] # 返回出現次數最大的label

注意,在testdata作為引數傳入knn函式之前,需要經過標準化。

我們用幾個小資料驗證一下knn函式是否能正常工作:

1 if __name__ == "__main__":

2 dataset = np.array([[2, 3], [6, 8]])

3 normdataset, ranges, minvals = normdata(dataset)

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

5 testdata = np.array([3.9, 5.5])

6 normtestdata = (testdata - minvals) / ranges

7 result = knn(normdataset, labels, normtestdata, 1)

8 print(result)

結果輸出 a ,與預期結果一致。

動手實現簡單的KNN python

先舉乙個可能不是很恰當的例子 近朱者赤近墨者黑 想象一下,假如你是乙個女孩紙,新認識乙個男性朋友,如果你了解到他周圍的朋友大部分是性格開朗,陽關帥氣的,你潛意識會覺得這個大概也是這樣的人,那如果他周圍大部分是那些 臭名昭著 名聲不是很好的朋友,你潛意識的會覺得,emmmmm這個人可能不是很靠譜,有待...

機器學習 初識機器學習

1.什麼是機器學習?對於機器學習到現在都還沒有統一的定義,但是,通過乙個例子和較權威的定義來理解機器學習,最後附上我個人對機器學習的理解 2.監督學習 1 監督學習基本思想 我們資料集中的每個樣本都有相應的 正確答案 即每個樣本都是真實值,再根據這些樣本作出 舉乙個房價預售的例子來說明 eg 下面圖...

機器學習 機器學習目錄

注 後期有時間的話會對每乙個演算法進行講解。1 普通線性回歸 2 廣義線性模型 3 邏輯回歸 4 線性判定分析1 決策樹基本原理與構建 2 cart演算法 3 回歸決策樹 4 分類決策樹1 貝葉斯定理與樸素貝葉斯 2 高斯貝葉斯分類器 3 多項式貝葉斯分類器 4 伯努利貝葉斯分類器 5 遞增式學習1...