機器學習 KNN演算法基本思想

2021-08-29 00:12:34 字數 2426 閱讀 4449

knn演算法--k近鄰演算法(k-nearest neighbors)

如下圖所示,用腫瘤的大小表示橫座標,時間表示中座標,其中紅色表示良性腫瘤,藍色表示惡性腫瘤。 根據下圖能夠得到8個點的初始資訊。

假如此時出現了第9個點,它的落點在第7個點和第8個點之間,怎麼判斷它的屬性是良性還是惡性呢?

在knn的演算法中,首先確定k的值,經典的k值為3,在這裡k= 3,表示尋找與第9個點最近的三個點。如下圖:

此時,在最近的三個點中,全是惡性腫瘤,沒有良性腫瘤,那麼第9個點的標籤則定義為惡性腫瘤。

knn演算法的本質就是,兩個高度相似的樣本,極有可能屬於同乙個標籤,當然比較的樣本數不止兩個,k的取值就是比較樣本的個數,在k個樣本中,哪個標籤的樣本數最多,那麼該新樣本的標籤就確定了。

描述兩個樣本是否相似度,採用計算在特徵空間中兩個樣本的距離來表示。

**講解:

1,首先準備好測試資料raw_data_x和測試標籤raw_data_y,用列表表示

2,將列表轉換成二維矩陣,x_train 表示測試資料,y_train表示測試標籤

x_train = np.array(raw_data_x)

y_train = np.array(raw_data_y)

3,引入待**的資料x

x = np.array([8.09360731,3.365731514])
4,計算x與特徵空間每個向量的距離,即x與x_train中每個向量x_train的距離。採用尤拉距離來表示,公式如下:

分別是平面和三維空間兩點的計算方式。

distance = 

for x_train in x_train:

d = sqrt((np.sum((x_train - x)**2)))

#另一種寫法

distance = [sqrt(np.sum((x_train -x)** 2)) for x_train in x_train]

5,將distance中的距離進行排序,按照從小到大的順序排列。這裡採用的是numpy中的argaort函式,排完序返回的是索引值。

比如[8,7,6,5,4,3,2,1,9,0],設定k的值,這裡設定k= 6,那麼從返回的索引排序值中,取前6個索引值表示的標籤。

a = np.argaort(distance)

k = 6

topk_y = (y_train[i] for i in a[:k])

6,計算topk_y中每個標籤出現的次數,那麼次數出現最多的標籤就是待**資料所屬標籤,這裡counter的返回值是字典形式。

votes = counter(topk_y)

predict = votes.most_common(1)[0][0]

print(predict)

knn演算法是機器學習中思想極簡單的分類演算法。

優點:1)簡單、有效。 

2)重新訓練的代價較低(類別體系的變化和訓練集的變化,在web環境和電子商務應用中是很常見的)。 

3)計算時間和空間線性於訓練集的規模(在一些場合不算太大)。 

4)由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。 

5)該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。

缺點:1)knn演算法是懶散學習方法(lazy learning,基本上不學習),一些積極學習的演算法要快很多。 

2)類別評分不是規格化的(不像概率評分)。 

3)輸出的可解釋性不強,例如決策樹的可解釋性較強。 

4)該演算法在分類時有個主要的不足是,當樣本不平衡時,如乙個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入乙個新樣本時,該樣本的k個鄰居中大容量類的樣本占多數。該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響執行結果。可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。 

5)計算量較大。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本

KNN演算法 基本思想

knn k 最近鄰居 演算法 該演算法的基本思路是 在給定新文字後,考慮在訓練文字集中與該新文字距離最近 最相似 的 k 篇文字,根據這 k 篇文字所屬的類別判定新文字所屬的類別,具體的演算法步驟如下 step one 根據特徵項集合重新描述訓練文字向量 step two 在新文字到達後,根據特徵詞...

機器學習中調參的基本思想

我發現大多數的機器學習相關的書都是遍歷各種演算法和案例,為大家講解各種各樣演算法的原理和用途,但卻對調參 甚少。這中間有許多原因,其一是因為,調參的方式總是根據資料的狀況而定,所以沒有辦法一概而論 其二是因為,其實大家也都沒有特別好的辦法。通過畫學習曲線,或者網格搜尋,我們能夠探索到調參邊緣 代價可...

機器學習中調參的基本思想

我發現大多數的機器學習相關的書都是遍歷各種演算法和案例,為大家講解各種各樣演算法的原理和用途,但卻對調參 甚少。這中間有許多原因,其一是因為,調參的方式總是根據資料的狀況而定,所以沒有辦法一概而論 其二是因為,其實大家也都沒有特別好的辦法。通過畫學習曲線,或者網格搜尋,我們能夠探索到調參邊緣 代價可...