機器學習 KNN 演算法

2021-07-08 18:37:19 字數 4915 閱讀 4122

一、主要目的

在樣本空間中,找到與待估計的樣本最臨近的k個鄰居,用這幾個鄰居的類別來估計待測樣本的類別

二、適用性

樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分。尤其適用於樣本分類邊界不規則的情況

三、不足

1、當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙個樣本的時候,k個臨近值中大多數都是大樣本容量的那個類,這時可能就會導致分類錯誤。改進方法是對k臨近點進行加權,也就是距離近的點的權值大,距離遠的點權值小。

2、計算量較大,每個待分類的樣本都要計算它到全部點的距離,根據距離排序才能求得k個臨近點,改進方法是:先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。

四、演算法步驟:

1)、計算已知類別資料集合彙總的點與當前點的距離

2)、按照距離遞增次序排序

3)、選取與當前點距離最近的k個點

4)、確定距離最近的前k個點所在類別的出現頻率

5)、返回距離最近的前k個點中頻率最高的類別作為當前點的**分類

五、matlab **實現

注意:不同的k取值,會影響分類的準確率。

六、資料歸一化

newdata = (olddata-minvalue)/(maxvalue-minvalue)

七、python **實現

fromnumpyimport*

importoperator

defcreatedataset():

group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

lables=['a','a','b','b']

returngroup,lables

# knn 分類演算法

defclassify0(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={}

foriinrange(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

returnsortedclasscount[0][0]

除錯方式:

importsys;

"/home/llp/code/funcdef")

importknn

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值的取法 之後取離索要 的點...