中国地质大学(武汉)模式识别第三次实验:knn

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1模式识别第三次实验学号:20121001873班学号:07512213姓名:吴泽光指导老师:马丽中国地质大学(武汉)机械与电子信息学院2015年4月2题目:基于kNN算法的遥感图像分类实验目标:1.掌握KNN算法原理2.用MATLAB实现kNN算法,并进行结果分析实验内容:1.先采用zy3sample数据,该数据分为4个类别:土地;农作物/植被;大棚;道路。再使用INP高光谱数据进行分类。2.随机在所有带标记的数据中选择train和test数据(比例自己定,可以50%train数据,50%test数据,也可以20%train数据80%test数据,或者其他比例;可以尝试不同train数据数目下,分类效果的差别),然后进行kNN分类。Train和test数据随机选择10次,然后求平均结果作为最终对算法的评价。3.利用部分带标记的数据作为train数据,对整个图像进行分类,得到整个图像的分类结果图。4.关于K值的选择,选择为1,3,5,7,9,11。分别用这6种K的取值进行kNN算法,得到每种K值下的总体分类精度OA,然后进行比较,plot画出不同K值下的OA变化曲线。5.关于距离度量的选择,可以采用欧氏距离或者光谱角距离,也可以这两种距离都采用,然后做比较,或者尝试其他可能更有效的距离度量方式。KNN算法原理:对一个待识别的测试样本点y,分别计算它与训练样本的距离,然后取距离最近的k个训练样本点,这个k个训练样本中哪一类出现的次数最多,就判y属于哪一类。算法步骤:1、首先分好训练数据和测试数据。2、将每一个测试数据与训练数据求距离。3、选取k值,每一个测试数据到训练数据的距离中取最小的k个值。4、将k中最多的那一类作为测试数据的最终分类结果。算法代码以及分类结果:50%train数据,50%test数据,也可以20%train数据80%test数据,或者其他比例,然后进行kNN分类。Train和test数据随机选择10次。对于K值的选择,可以选择为1,3,5,7,9,11等。分别用这6种K的取值进行kNN算法,得到每种K值下的总体分类精度OA。clear%%readthedatazy3sample1Img=multibandread('zy3sample1',[400,400,4],'float',0,'bsq','n',{'Band','D3irect',[1:4]});%将高广谱数据读入GT=multibandread('cap',[400,400,1],'uint8',0,'bsq','n',{'Band','Direct',[1:1]});%将高广谱数据读入test_class=1:4;C=length(test_class);NbRow=400;NbCol=400;NbDim=4;dataname='zy3';nrep=10;%10experiments.Sampling=50;%selectingsamplingpercentdataastrainingdata.k=1:2:11;OA_ave1=[];foru=1:6forexpt=1:nrepfprintf(1,'precessingontheexperiment%d\n',expt);%将expt的值依次显示出来%%randomlyselecttrainingdataandtestingdataTrain_row=[];Train_col=[];%Train_rowandTrain_colisthecoordinates(坐标)oftrainingdataTest_row=[];Test_col=[];%Test_rowandTest_colisthecoordinatesoftestingdataY_train=[];Y_test=[];%Y_trainisthelabeloftrainingdata(N_train*1);Y_testisthelabeloftestingdata(N_test*1);X_train=[];X_test=[];%X_trainisthetrainingdata(N_train*D);X_testisthetestingdata(N_test*D);%%可以直接在GT中提取,也可以先ExtractDataFromROI把所有标签数据提取出来后再按照比例选择train和testfori=1:length(test_class)[row,col]=find(GT==i);n(i)=length(row);temp=randperm(n(i));ind_train=temp(1:round(n(i)*Sampling/100));%round四舍五入ind_test=temp(round(n(i)*Sampling/100)+1:end);%在temp中后几个值赋给ind_testTrain_row=[Train_row;row(ind_train)];%label数据的rowTrain_col=[Train_col;col(ind_train)];4n_train(i)=round(n(i)*Sampling/100);Test_row=[Test_row;row(ind_test)];%label数据的rowTest_col=[Test_col;col(ind_test)];n_test(i)=n(i)-n_train(i);forj=1:n_train(i)X_train=[X_train;reshape(Img(row(ind_train(j)),col(ind_train(j)),:),1,NbDim)];endforj=1:n_test(i)X_test=[X_test;reshape(Img(row(ind_test(j)),col(ind_test(j)),:),1,NbDim)];endY_train=[Y_train;repmat(test_class(i),n_train(i),1)];Y_test=[Y_test;repmat(test_class(i),n_test(i),1)];end%dataK=k(u);%%nowyouneedtocalculatetheoverall_accuracywhichisusedto[result]=MLknn_to_black(X_train,Y_train,X_test,K);%train_data:nband*nsamp;train_label:1*nsampM=length(X_test);N=0;forl=1:Mif(Y_test(l)==result(l))N=N+1;endendOA(expt)=N/M;fprintf('OA=%d',OA(expt));endOA_ave=mean(OA(expt))OA_ave1=[OA_ave1;OA_ave];endplot(OA_ave1);Knn分类函数:functionresult=MLknn_to_black(X_train,Y_train,X_test,K)D=[];t=[];5D=Euclidian_distance(X_test,X_train);[V,ID]=sort(D,2);%按照行来排序V是排序后的值,ID是值原来的位置ID=ID(:,1:K);forj=1:Kt(:,j)=Y_train(ID(:,j));endresult=mode(t,2);下图分别为训练数据取20%和50%后的分类结果。由图可以看书,训练数据选择越多,分类效果越好,OA的值越大,分类误差越小。利用所有或者部分带标记的数据作为train数据,对整个图像进行分类,得到整个图像的分类结果图。程序如下:clear%%readthedatazy3sample1Img=multibandread('zy3sample1',[400,400,4],'float',0,'bsq','n',{'Band','Direct',[1:4]});%将高广谱数据读入GT=multibandread('cap',[400,400,1],'uint8',0,'bsq','n',{'Band','Direct',[1:1]});%将高广谱数据读入test_class=1:4;C=length(test_class);NbRow=400;NbCol=400;NbDim=4;dataname='zy3';data=reshape(Img,160000,NbDim);nrep=10;%10experiments.Sampling=6;%selectingsamplingpercentdataastrainingdata.6forexpt=1:nrepfprintf(1,'precessingontheexperiment%d\n',expt);%将expt的值依次显示出来Train_row=[];Train_col=[];%Train_rowandTrain_colisthecoordinates(坐标)oftrainingdataTest_row=[];Test_col=[];%Test_rowandTest_colisthecoordinatesoftestingdataY_train=[];Y_test=[];%Y_trainisthelabeloftrainingdata(N_train*1);Y_testisthelabeloftestingdata(N_test*1);X_train=[];X_test=[];%X_trainisthetrainingdata(N_train*D);X_testisthetestingdata(N_test*D);%%可以直接在GT中提取,也可以先ExtractDataFromROI把所有标签数据提取出来后再按照比例选择train和testfori=1:length(test_class)[row,col]=find(GT==i);n(i)=length(row);temp=randperm(n(i));ind_train=temp(1:round(n(i)*Sampling/100));%round四舍五入Train_row=[Train_row;row(ind_train)];%label数据的rowTrain_col=[Train_col;col(ind_train)];n_train(i)=round(n(i)*Sampling/100);forj=1:n_train(i)X_train=[X_train;reshape(Img(row(ind_train(j)),col(ind_train(j)),:),1,NbDim)];endY_train=[Y_train;repmat(test_class(i),n_train(i),1)];endK=3;[result]=MLknn_to_black(X_train,Y_train,data,K);%train_data:nband*nsamp;train_label:1*nsampendDATA=result;LINES=400;SAMPLES=400;ColorTable=[160,82,45;%c1:soil255,255,255;%c3:house02550;%c4road7255,0,0];%c2:grassCOLORTABLE=ColorTable;[ClassificationMap]=GenerateClassificationMap(LINES,SAMPLES,COLORTABLE,DATA);imshow(ClassificationMap);分类结果如下:图1K=1图2K=3图3K=5图4K=7图5K=11可知当k的值越大时,算法的分类效果越好。8当判别距离选择为欧氏距离时,分类结果如下:当判别距离选择为光谱角距离时,分类结果如下:所以,选择欧氏距离最为判别分类效果比光谱角距离好。实验总结:这次实验对KNN算法了解了很多

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功