資源描述:
《模式識別 最近鄰法和k近鄰法MATLAB實現(xiàn)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、最近鄰法和k-近鄰法學(xué)號:02105120姓名:吳林一.基本概念:最近鄰法:對于未知樣本x,比較x與N個已知類別的樣本之間的歐式距離,并決策x與距離它最近的樣本同類。K近鄰法:取未知樣本x的k個近鄰,看這k個近鄰中多數(shù)屬于哪一類,就把x歸為哪一類。K取奇數(shù),為了是避免k1=k2的情況。二.問題分析:要判別x屬于哪一類,關(guān)鍵要求得與x最近的k個樣本(當(dāng)k=1時,即是最近鄰法),然后判別這k個樣本的多數(shù)屬于哪一類。可采用歐式距離公式求得兩個樣本間的距離s=sqrt((x1-x2)^2+(y1-y2)
2、^2)三.算法分析:該算法中任取每類樣本的一半作為訓(xùn)練樣本,其余作為測試樣本。例如iris中取每類樣本的25組作為訓(xùn)練樣本,剩余25組作為測試樣本,依次求得與一測試樣本x距離最近的k個樣本,并判斷k個樣本多數(shù)屬于哪一類,則x就屬于哪類。測試10次,取10次分類正確率的平均值來檢驗算法的性能。四.MATLAB代碼:最近鄰算實現(xiàn)對Iris分類clc;totalsum=0;forii=1:10data=load('iris.txt');data1=data(1:50,1:4);%任取Iris-seto
3、sa數(shù)據(jù)的25組rbow1=randperm(50);trainsample1=data1(rbow1(:,1:25),1:4);rbow1(:,26:50)=sort(rbow1(:,26:50));%剩余的25組按行下標大小順序排列testsample1=data1(rbow1(:,26:50),1:4);data2=data(51:100,1:4);%任取Iris-versicolor數(shù)據(jù)的25組rbow2=randperm(50);trainsample2=data2(rbow2(:,1
4、:25),1:4);rbow2(:,26:50)=sort(rbow2(:,26:50));testsample2=data2(rbow2(:,26:50),1:4);data3=data(101:150,1:4);%任取Iris-virginica數(shù)據(jù)的25組rbow3=randperm(50);trainsample3=data3(rbow3(:,1:25),1:4);rbow3(:,26:50)=sort(rbow3(:,26:50));testsample3=data3(rbow3(:,
5、26:50),1:4);trainsample=cat(1,trainsample1,trainsample2,trainsample3);%包含75組數(shù)據(jù)的樣本集testsample=cat(1,testsample1,testsample2,testsample3);newchar=zeros(1,75);sum=0;[i,j]=size(trainsample);%i=60,j=4[u,v]=size(testsample);%u=90,v=4forx=1:ufory=1:iresult=
6、sqrt((testsample(x,1)-trainsample(y,1))^2+(testsample(x,2)-trainsample(y,2))^2+(testsample(x,3)-trainsample(y,3))^2+(testsample(x,4)-trainsample(y,4))^2);%歐式距離newchar(1,y)=result;end;[new,Ind]=sort(newchar);class1=0;class2=0;class3=0;ifInd(1,1)<=25cl
7、ass1=class1+1;elseifInd(1,1)>25&&Ind(1,1)<=50class2=class2+1;elseclass3=class3+1;endifclass1>class2&&class1>class3m=1;ty='Iris-setosa';elseifclass2>class1&&class2>class3m=2;ty='Iris-versicolor';elseifclass3>class1&&class3>class2m=3;ty='Iris-virginica
8、';elsem=0;ty='none';endifx<=25&&m>0disp(sprintf('第%d組數(shù)據(jù)分類后為%s類',rbow1(:,x+25),ty));elseifx<=25&&m==0disp(sprintf('第%d組數(shù)據(jù)分類后為%s類',rbow1(:,x+25),'none'));endifx>25&&x<=50&&m>0disp(sprintf('第%d組數(shù)據(jù)分類后為%s類',50+rbow2(:,x),ty));elseifx>25&&x<=50&&m==0disp(s