刻意練習機器學習實戰 Task01 K鄰近演算法

2021-09-29 16:48:08 字數 3768 閱讀 5336

k最近鄰(k-nearest neighbor,knn)分類演算法,是乙個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:在特徵空間中,如果乙個樣本附近的k個最近(即特徵空間中最鄰近)樣本的大多數屬於某乙個類別,則該樣本也屬於這個類別。

k近鄰(knn,k-nearestneighbor)分類演算法是資料探勘分類技術中最簡單的方法之一。 所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特徵。該方法在確定分類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。knn方法在類別決策時,只與極少數的相鄰樣本有關。由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或者重疊較多的待分樣本集來說,knn方法較其他方法更為適合。

如下圖所示,有兩類不同的樣本資料,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的資料則是待分類的資料。也就是說,現在, 我們不知道中間那個綠色的資料是從屬於哪一類(藍色小正方形or紅色小三角形),下面,我們就要解決這個問題:給這個綠色的圓分類。

我們常說,物以類聚,人以群分,判別乙個人是乙個什麼樣品質特徵的人,常常可以從他/她身邊的朋友入手,所謂觀其友,而識其人。我們不是要判別上圖中那個綠色的圓是屬於哪一類資料麼,好說,從它的鄰居下手。但一次性看多少個鄰居呢?從上圖中,你還能看到:

如果k=3,綠色圓點的最近的3個鄰居是2個紅色小三角形和1個藍色小正方形,少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於紅色的三角形一類。

如果k=5,綠色圓點的最近的5個鄰居是2個紅色三角形和3個藍色的正方形,還是少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於藍色的正方形一類。

於此我們看到,當無法判定當前待分類點是從屬於已知分類中的哪一類時,我們可以依據統計學的理論看它所處的位置特徵,衡量它周圍鄰居的權重,而把它歸為(或分配)到權重更大的那一類。這就是k近鄰演算法的核心思想。

knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。

knn 演算法本身簡單有效,它是一種 lazy-learning 演算法,分類器不需要使用訓練集進行訓練,訓練時間複雜度為0。knn 分類的計算複雜度和訓練集中的文件數目成正比,也就是說,如果訓練集中文件總數為 n,那麼 knn 的分類時間複雜度為o(n)。

knn方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。

k 近鄰演算法使用的模型實際上對應於對特徵空間的劃分。k 值的選擇,距離度量和分類決策規則是該演算法的三個基本要素:

k 值的選擇會對演算法的結果產生重大影響。k值較小意味著只有與輸入例項較近的訓練例項才會對**結果起作用,但容易發生過擬合;如果 k 值較大,優點是可以減少學習的估計誤差,但缺點是學習的近似誤差增大,這時與輸入例項較遠的訓練例項也會對**起作用,使**發生錯誤。在實際應用中,k 值一般選擇乙個較小的數值,通常採用交叉驗證的方法來選擇最優的 k 值。隨著訓練例項數目趨向於無窮和 k=1 時,誤差率不會超過貝葉斯誤差率的2倍,如果k也趨向於無窮,則誤差率趨向於貝葉斯誤差率。

該演算法中的分類決策規則往往是多數表決,即由輸入例項的 k 個最臨近的訓練例項中的多數類決定輸入例項的類別

距離度量一般採用 lp 距離,當p=2時,即為歐氏距離,在度量之前,應該將每個屬性的值規範化,這樣有助於防止具有較大初始值域的屬性比具有較小初始值域的屬性的權重過大。

knn演算法不僅可以用於分類,還可以用於回歸。通過找出乙個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成反比。 該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的k個鄰居中大容量類的樣本占多數。 該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響執行結果。可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。

該方法的另乙個不足之處是計算量較大,因為對每乙個待分類的文字都要計算它到全體已知樣本的距離,才能求得它的k個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。

實現 k 近鄰演算法時,主要考慮的問題是如何對訓練資料進行快速 k 近鄰搜尋,這在特徵空間維數大及訓練資料容量大時非常必要。

# k-近鄰演算法

def classify0

(inx,dataset,labels,k)

: # shape讀取資料矩陣第一維度的長度

datasetsize = dataset.shape[0]

# tile重複陣列inx,有dataset行 1個dataset列,減法計算差值

diffmat =

tile

(inx,

(datasetsize,1)

)- dataset

# **是冪運算的意思,這裡用的歐式距離

sqdiffmat = diffmat **

2 # 普通sum預設引數為axis=

0為普通相加,axis=

1為一行的行向量相加

sqdistances = sqdiffmat.

sum(axis=1)

distances = sqdistances **

0.5 # argsort返回數值從小到大的索引值(陣列索引0,1

,2,3)

sorteddistindicies = distances.

argsort()

# 選擇距離最小的k個點

classcount =

for i in

range

(k):

# 根據排序結果的索引值返回靠近的前k個標籤

votelabel = labels[sorteddistindicies[i]

] # 各個標籤出現頻率

classcount[votelabel]

= classcount.

get(votelabel,0)

+1##!!!

!! classcount.

iteritems

()修改為classcount.

items()

#sorted

(iterable, cmp=none, key=none, reverse=false)

-->

newsorted list。

# reverse預設公升序 key關鍵字排序itemgetter(1)按照第一維度排序(0

,1,2

,3) sortedclasscount =

sorted

(classcount.

items()

, key=operator.

itemgetter(1

),reverse=true)

return sortedclasscount[0][0]

機器學習Task01

x,y 輸入資料,array like,shape n,s 點的大小 標量或array like,shape n,可選 大小以點數 2。預設是rcparams lines.markersize 2。c 點的顏色 順序或顏色順序,可選,預設 b c可以是單個顏色格式的字串,也可以是一系列顏色 規範的長...

動手學深度學習 task01

task 1 線性回歸 多層感知機 softmax函式 1 線性回歸作為基本的機器學習演算法,實現較簡單,應用廣泛。以下為用pytorch編寫的線性回歸類 import torch.nn as nn import torch from torch.autograd import variable f...

pandas 學習心得 task01

查漏補缺,新學技能 zip函式和enumerate方法 a 1,2,3 b 4,5,6 zip a,b 1,2,3 4,5,6 enumerate方法 類似返回series形式 np.linspace和np.arange np.linpace 1,10,5 1到10之間均勻取5個數 np.arang...