matlab knn实现,Matlab之KNN实现
1.?????算法流程
1)??????通過Matlab產生高斯分布產生兩類數據,并標明類別
2)??????數據初始化:設置K=某個常數(一般為奇數)
3)??????對于每個測試數據,
計算其到兩類數據的所有點的距離
對于上述求得的距離,選出K個最小的,
檢測這選出的K個值中屬于類別1和類別2的個數
If Cnt1>Cnt2
屬于類別1;
Else
屬于類別2;
2、實驗代碼:
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); %產生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; %產生100行1列的全為2的矩陣
data=[data1;data2];%數據合并
label=[label1;label2];
grid on;
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); %產生200行1列的零矩陣
for i=1:200
distance(i)=sqrt((test_data(1)-data(i,1)).^2+(test_data(2)-data(i,2)).^2); %(xi-X)2+(yj-Y)2
end
%選擇排序法,只找出最小的前K個數據,對數據和標號都進行排序
for i=1:K
ma=distance(i);
for j=i+1:200
if distance(j)
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
3、結果說明
本算法的測試數據是坐標軸上的點,范圍是x[-3,3], y[-3,3];
最終結果一類用黑點表示,一類用空白表示
4、算法結果:
總結
以上是生活随笔為你收集整理的matlab knn实现,Matlab之KNN实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows oracle 内存大,如
- 下一篇: 贾又福大象鸿蒙,奏乐!继续吹!库里又创记