KNN演算法(鄰近演算法)

2021-07-15 05:53:41 字數 3499 閱讀 1098

鄰近演算法(),或者說k最近鄰(knn,k-nearestneighbor)分類演算法是

資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。

knn演算法的核心思想:

是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。 knn方法在類別決策時,只與極少量的相鄰樣本有關。由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。

用途:用於分類,對未知事物的識別

右圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k=3,由於紅色三角形所佔比例為2/3,綠色圓將被賦予紅色三角形那個類,如果k=5,由於藍色四方形比例為3/5,因此綠色圓被賦予藍色四方形類。

knn演算法的決策過程

k最近鄰(k-nearest neighbor,knn)分類演算法,是乙個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果乙個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。 knn方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於knn方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,knn方法較其他方法更為適合。

knn演算法不僅可以用於分類,還可以用於回歸。通過找出乙個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的

權值(weight),如權值與距離成反比。

演算法流程

1. 準備資料,對資料進行

預處理2. 選用合適的資料結構儲存訓練資料和測試元組

3. 設定引數,如k

4.維護乙個大小為k的的按距離由大到小的

優先順序佇列,用於儲存最近鄰訓練元組。隨機從訓練元組中選取k個元組作為初始的最近鄰元組,分別計算測試元組到這k個元組的距離,將訓練元組標號和距離存入優先順序佇列

5. 遍歷訓練元組集,計算當前訓練元組與測試元組的距離,將所得距離l 與優先順序佇列中的最大距離lmax

6. 進行比較。若l>=lmax,則捨棄該元組,遍歷下乙個元組。若l < lmax,刪除優先順序佇列中最大距離的元組,將當前訓練元組存入優先順序佇列。

7. 遍歷完畢,計算優先順序佇列中k 個元組的多數類,並將其作為測試元組的類別。

8. 測試元組集測試完畢後計算誤差率,繼續設定不同的k值重新進行訓練,最後取誤差率最小的k 值。

[1]1.簡單,易於理解,易於實現,無需估計引數,無需訓練;

2. 適合對稀有事件進行分類;

3.特別適合於多分類問題(multi-modal,物件具有多個類別標籤), knn比svm的表現要好。

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

該方法的另乙個不足之處是計算量較大,因為對每乙個待分類的文字都要計算它到全體已知樣本的距離,才能求得它的k個最近鄰點。

可理解性差,無法給出像決策樹那樣的規則。

knn演算法因其提出時間較早,隨著其他技術的不斷更新和完善,knn演算法的諸多不足之處也逐漸顯露,因此許多knn演算法的改進演算法也應運而生。

針對以上演算法的不足,演算法的改進方向主要分成了分類效率和分類效果兩方面。

分類效率:事先對樣本屬性進行約簡,刪除對分類結果影響較小的屬性,快速的得出待分類樣本的類別。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。

分類效果:採用權值的方法(和該樣本距離小的鄰居權值大)來改進,han等人於2023年嘗試利用貪心法,針對檔案分類實做可調整權重的k最近鄰居法waknn (weighted adjusted k nearest neighbor),以促進分類效果;而li等人於2023年提出由於不同分類的檔案本身有數量上有差異,因此也應該依照訓練集合中各種分類的檔案數量,選取不同數目的最近鄰居,來參與分類。

clear all;

close all;

clc;

%%第乙個類資料和標號

mu1=[0 0]; %均值

s1=[0.3 0;0 0.35]; %協方差

data1=mvnrnd(mu1,s1,100); %產生高斯分布資料

plot(data1(:,1),data1(:,2),'+');

label1=ones(100,1);

hold on;

%%第二個類資料和標號

mu2=[1.25 1.25];

s2=[0.3 0;0 0.35];

data2=mvnrnd(mu2,s2,100);

plot(data2(:,1),data2(:,2),'ro');

label2=label1+1;

data=[data1;data2];

label=[label1;label2];

k=11; %兩個類,k取奇數才能夠區分測試資料屬於那個類

%測試資料,knn演算法看這個數屬於哪個類

for ii=-3:0.1:3

for jj=-3:0.1:3

test_data=[ii jj]; %測試資料

label=[label1;label2];

%%下面開始knn演算法,顯然這裡是11nn。

%求測試資料和類中每個資料的距離,歐式距離(或馬氏距離)

distance=zeros(200,1);

for i=1:200

distance(i)=sqrt((test_data(1)-data(i,1)).^2+(test_data(2)-data(i,2)).^2);

end%選擇排序法,只找出最小的前k個資料,對資料和標號都進行排序

for i=1:k

ma=distance(i);

for j=i+1:200

if distance(j)cls2

plot(ii,jj); %屬於類1的資料畫小黑點

endend

end

**中是兩個高斯分布的類,變數取x=-3:3,y=-3:3中的資料,看看這些資料都是屬於哪個類。

下面是執行效果圖:

KNN演算法 鄰近演算法

knn演算法是機器學習裡面比較簡單的乙個分類演算法了,整體思想比較簡單 計算乙個點a與其他所有點之間的距離,取出與該點最近的k個點,然後統計這k個點裡面所屬分模擬例最大的,則點a屬於該分類。這樣講可能還有點迷糊,下面用乙個例子來說明一下 電影名稱 打鬥次數 接吻次數 電影型別 california ...

演算法 K NN鄰近演算法

關注公zhong號 落葉歸根的豬。獲取資源,交個朋友 k nearest neighbors 1.基本概念與原理 k近鄰演算法是一種基本分類和回歸方法。knn演算法非常簡單且非常有效。knn的模型表示是整個訓練資料集。該演算法的思想是 乙個樣本與資料集中的k個樣本最相似,如果這k個樣本中的大多數屬於...

knn鄰近演算法

knn演算法即為k鄰近演算法,是一種監督式的機器學習演算法,且它是用來進行分類的。注意此演算法需要和 k means演算法進行區別,因為都有個k。工作原理是 存在乙個樣本資料集合,也稱作訓練樣本集,且樣本集中每個資料都存在標籤,知道樣本集中與所屬分類的對應關係。輸入沒有定義的新資料後,將新資料的每個...