一、主要目的
在樣本空間中,找到與待估計的樣本最臨近的k個鄰居,用這幾個鄰居的類別來估計待測樣本的類別
二、適用性
樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分。尤其適用於樣本分類邊界不規則的情況
三、不足
1、當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙個樣本的時候,k個臨近值中大多數都是大樣本容量的那個類,這時可能就會導致分類錯誤。改進方法是對k臨近點進行加權,也就是距離近的點的權值大,距離遠的點權值小。
2、計算量較大,每個待分類的樣本都要計算它到全部點的距離,根據距離排序才能求得k個臨近點,改進方法是:先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。
四、演算法步驟:
1)、計算已知類別資料集合彙總的點與當前點的距離
2)、按照距離遞增次序排序
3)、選取與當前點距離最近的k個點
4)、確定距離最近的前k個點所在類別的出現頻率
5)、返回距離最近的前k個點中頻率最高的類別作為當前點的**分類
五、matlab **實現
注意:不同的k取值,會影響分類的準確率。
六、資料歸一化
newdata = (olddata-minvalue)/(maxvalue-minvalue)
七、python **實現
from
numpy
import
*
import
operator
def
createdataset():
group
=
array([[
1.0
,
1.1
],[
1.0
,
1.0
],[
0
,
0
],[
0
,
0.1
]])
lables
=
[
'a'
,
'a'
,
'b'
,
'b'
]
return
group,lables
# knn 分類演算法
def
classify0(inx,dataset,labels,k):
datasetsize
=
dataset.shape[
0
]
# shape[0]獲取行 shape[1] 獲取列
# 第一步,計算歐式距離
diffmat
=
tile(inx,(datasetsize,
1
))
-
dataset
#tile類似於matlab中的repmat,複製矩陣
sqdiffmat
=
diffmat
*
*
2
sqdistances
=
sqdiffmat.
sum
(axis
=
1
)
distance
=
sqdistances
*
*
0.5
sorteddistindecies
=
distance.argsort()
# 增序排序
classcount
=
{}
for
i
in
range
(k):
# 獲取類別
voteilabel
=
labels[sorteddistindecies[i]]
#字典的get方法,查詢classcount中是否包含voteilabel,是則返回該值,不是則返回defvalue,這裡是0
# 其實這也就是計算k臨近點中出現的類別的頻率,以次數體現
classcount[voteilabel]
=
classcount.get(voteilabel,
0
)
+
1
# 對字典中的類別出現次數進行排序,classcount中儲存的事 key-value,其中key就是label,value就是出現的次數
# 所以key=operator.itemgetter(1)選中的事value,也就是對次數進行排序
sortedclasscount
=
sorted
(classcount.iteritems(),key
=
operator.itemgetter(
1
),reverse
=
true
)
#sortedclasscount[0][0]也就是排序後的次數最大的那個label
return
sortedclasscount[
0
][
0
]
除錯方式:
import
sys;
"/home/llp/code/funcdef"
)
import
knn
group,labels
=
knn.createdataset();
relust
=
knn.classify0([
0
,
0
],group,labels,
3
)
print
'the classify relust is :'
, relust
八、高階版
knn演算法簡單有效,但沒有優化的暴力演算法效率容易受到瓶頸。如果樣本個數為n,特徵維度為d,則複雜度以o(n*d)增長。
解決辦法:把訓練資料構建成k-d tree(k-dimensional tree).
搜尋速度高達o(d*log(n))。
不過當d維度過高,會產生所謂的」維度災難「,最終效率會降低到與暴力法一樣。
因此通常d>20以後,最好使用更高效率的ball-tree,其時間複雜度為o(d*log(n))
測試**(利用sklearn 庫)
knn分類器在眾多分類演算法中屬於最簡單的之一,需要注意的地方不多。有這幾點要說明:
1、kneighborsclassifier可以設定3種演算法:『brute』,『kd_tree』,『ball_tree』。如果不知道用哪個好,設定『auto』讓kneighborsclassifier自己根據輸入去決定。
2、注意統計準確率時,分類器的score返回的是計算正確的比例,而不是r2。r2一般應用於回歸問題。
3、本例先根據樣本中身高體重的最大最小值,生成了乙個密集網格(步長h=0.01),然後將網格中的每乙個點都當成測試樣本去測試,最後使用contourf函式,使用不同的顏色標註出了胖、廋兩類。
容易看到,本例的分類邊界,屬於相對複雜,但卻又與距離呈現明顯規則的鋸齒形。
這種邊界線性函式是難以處理的。而knn演算法處理此類邊界問題具有天生的優勢,這個資料集達到準確率=0.94算是很優秀的結果了。
機器學習 演算法 KNN
參考 我感覺knn是最簡單的乙個機器學習演算法,實現很簡單,效果也一般般 就是算個euclideam distance,還有一些可以優化的地方,比如可以加權,第二篇文章提到了 python 如下 coding utf 8 created on aug 30,2013 author blacklaw ...
機器學習 KNN演算法
一 近 鄰 算 法 knn 原理 工 作 原 理 是 存 在 一 個 樣 本 資料 集 合 也 稱 作 訓練 樣 本 集 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 輸 人 沒 有 標 籤 的 新 ...
機器學習 kNN演算法
最近鄰居法 knn演算法,又譯k 近鄰演算法 是一種用於分類和回歸的非引數統計方法。例如 根據腫瘤大小和時間兩個特徵對腫瘤的良性和惡性的 其中綠色為良性,紅色為惡性,現在要 藍色這一資料是良性還是惡性,那麼對於knn演算法是怎麼 的呢?大概思路 首先取乙個k值 要點一 k值的取法 之後取離索要 的點...