K最鄰近密度估計技術是一種分類方法,不是聚類方法。
不是最優方法,實踐中比較流行。
通俗但不一定易懂的規則是:
1.計算待分類數據和不同類中每一個數據的距離(歐氏或馬氏)。
2.選出最小的前K數據個距離,這里用到選擇排序法。
3.對比這前K個距離,找出K個數據中包含最多的是那個類的數據,即為待分類數據所在的類。
不通俗但嚴謹的規則是:
給定一個位置特征向量x和一種距離測量方法,於是有:
1.在N個訓練向量外,不考慮類的標簽來確定k鄰近。在兩類的情況下,k選為奇數,一般不是類M的倍數。
2.在K個樣本之外,確定屬於wi,i=1,2,...M類的向量的個數ki,顯然sum(ki)=k。
3.x屬於樣本最大值ki的那一類wi。
如下圖,看那個綠色的值,是算三角類呢還是算矩類形呢,這要看是用幾NN了,要是3NN就屬於三角,要是5NN就屬於矩形。
至於K到底取幾,不同情況都要區別對待的。
下面是相關matlab代碼:
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)<ma ma=distance(j); label_ma=label(j); tmp=j; end end distance(tmp)=distance(i); %排數據 distance(i)=ma; label(tmp)=label(i); %排標號,主要使用標號 label(i)=label_ma; end cls1=0; %統計類1中距離測試數據最近的個數 for i=1:K if label(i)==1 cls1=cls1+1; end end cls2=K-cls1; %類2中距離測試數據最近的個數 if cls1>cls2 plot(ii,jj); %屬於類1的數據畫小黑點 end end end
代碼中是兩個高斯分布的類,變量取x=-3:3,y=-3:3中的數據,看看這些數據都是屬於哪個類。
下面是運行效果圖: