end
mm1 = mean(dd1')'; mm2 = mean(dd2')';
yo = (mm1 + mm2)/2; for ii=1:208
y = w' * M (ii,1 : bb-1)'; if (y >= yo) result(ii) = 1; elseif y < yo result(ii) = 2; % else
% result(ii) = 4; end end
err = M(:,61)-result'; err1 = err(1:num1-1); err2 = err(num1:aa);
ErrRate1 = sum(abs(err1))/(num1-1); sum1 = sum1 + ErrRate1;
ErrRate2 = sum(abs(err2))/(num2-1); sum2 = sum2 + ErrRate2; end
correctrate1 = 1 - sum1/10 correctrate2 = 1 - sum2/10
figure (1) hold on
plot(dd1,'^'); plot(dd2,'*')
figure (2) hold on
plot(d1,'^'); plot(d2,'*')
2.近邻法 %对wdbc数据求解
clc; clear;
M = csvread('E:\\power\\专业课程\\大作业们\\wdbc.csv'); [aa, bb] = size(M);%求行数(aa),求列数(bb) sum1= 0; sum2= 0; for iii=1:10 num1 = 1; num2 = 1; for n=1:aa if M(n, 1) == 1
Data1(num1,:) = M(n, 2:bb); %按行抽取数据
num1 = num1+1; else
Data2(num2,:) = M(n, 2:bb); %抽取数据 num2 = num2+1; end end
vector1 = randsample([1:num1-1],floor(num1/2)); vector2 = randsample([1:num2-1],floor(num2/2)); d1=Data1( vector1, :); %取一半的数据 d2=Data2( vector2, :);
for ii=1:aa
min1=inf; %初始化min1为最小值 for jj=1:floor(num1/2)
x=norm(M(ii,2:bb)-d1(jj,:)); if(x %训练样本和第一组样本比较 min2=inf; for jj=1:floor(num2/2) x=norm(M(ii,2:bb)-d2(jj,:)); if(x %训练样本和第二组样本比较 %找出最短欧氏距离 if min1 result(ii, 1) = 1; else result(ii, 1) = 2; end end counter1 = 0; counter2 = 0; for ii = 1:aa if M(ii, 1)-result(ii,1) == -1 counter1= counter1+ 1; elseif M(ii, 1)-result(ii,1) == 1 counter2= counter2+ 1; end end correctrate1= 1 - abs(counter1)/aa ; %第一类错分到第二类(第一类被判别为第一类) correctrate2= 1 - counter2/aa ; %第二类错分到第一类(第二类被判别为第二类)correctrate1 sum1= correctrate1+ sum1; sum2= correctrate2+ sum2; end correctrate1= sum1/10 correctrate2= sum2/10 C.实验结果及分析 1)sonar数据 1)fisher判别 图1, sonar数据的fisher判别识别率 分析:随机在第一类里面选取一半的数据作为训练样本,然后与全部的数据进行作差比较,看剩下的原本属于第一类的样本是否也属于第一类,若测试样本仍然属于第一类,就计数得到正确率;若不为第一类,则计数得到错误率。在sonar样本中,用fisher判别得到的上组数据的识别率如上图。识别率的高低意味着原本分类的正确程度。这就说明原本这两类数据的给出已经分的较开。 图2,sonar数据fisher判别的降维分类图 上图是sonar六十维度的数据经过降维得到的二维图像,可以很明显的看出,在第二类里面有一个‘*’被错分。而w*也可以清晰的看出他的大致范围。我不太会把他们投影到一条一线上,像网上得到的那种图,但是用这个图也可以清晰的看出他的划分程度。 2)近邻法 图3,sonar数据的近邻法识别率 分析:近邻法同样是在两类里面选取一半的数据作为实验样本,另一半作为测试样本,过程是用测试的样本与第一类里的实验样本和第二类里的实验样本分别做欧氏距离。假设用第一类的测试样本中的一个数据做测试,若与第一类中得到的欧式距离最近则划分为第一类,同时也证明了原来划分是正确的;若与第二类中的得到的欧式距离最近则划分为第二类,计数它为错误的划分。 近邻法得到的识别率比fisher得到的识别率高,这也说明了近邻法比fisher更优。 2.wdbc数据 1)fisher判别 图4,wdbc数据的fisher判别识别率 Wdbc是30维度的数据测试结果如上图。得到的识别率相对较高。 图5,wdbc数据的fisher判别降维分类图 2)近邻法 图6,wdbc数据的近邻法识别率 VI. 报告总结 通过本次大作业,我深刻的理解了fisher判别和近邻法,并对matlab也有了一定的学习。为了写好大作业,要在网上进行资料查找,和别人对比,让自己的大作业有更多的亮点。编程能力也有了不少的提升。对matlab环境不太熟悉,很多语句思想都来自c语言,但是本质的东西并没有太多变化,理解了fisher的降维和分类思想,理解了近邻法的求欧氏距离和其判别思想,编程也就容易多了。通过这次大作业确实进步不少。感谢老师能给我们这个机会!