LDA算法
对于两类问题的LDA(Matlab实现)
1 function [ W] = FisherLDA(w1,w2) 2 %W最大特征值对应的特征向量 3 %w1 第一类样本 4 %w2 第二类样本 5 6 %第一步:计算样本均值向量 7 m1=mean(w1);%第一类样本均值 8 m2=mean(w2);%第二类样本均值 9 m=mean([w1;w2]);%总样本均值 10 11 %第二步:计算类内离散度矩阵Sw 12 n1=size(w1,1);%第一类样本数 13 n2=size(w2,1);%第二类样本数 14 %求第一类样本的散列矩阵s1 15 s1=0; 16 for i=1:n1 17 s1=s1+(w1(i,:)-m1)\'*(w1(i,:)-m1); 18 end 19 %求第二类样本的散列矩阵s2 20 s2=0; 21 for i=1:n2 22 s2=s2+(w2(i,:)-m2)\'*(w2(i,:)-m2); 23 end 24 Sw=(n1*s1+n2*s2)/(n1+n2); 25 %第三步:计算类间离散度矩阵Sb 26 Sb=(n1*(m-m1)\'*(m-m1)+n2*(m-m2)\'*(m-m2))/(n1+n2); 27 %第四步:求最大特征值和特征向量 28 %[V,D]=eig(inv(Sw)*Sb);%特征向量V,特征值D 29 A = repmat(0.1,[1,size(Sw,1)]); 30 B = diag(A); 31 [V,D]=eig(inv(Sw + B)*Sb); 32 [a,b]=max(max(D)); 33 W=V(:,b);%最大特征值对应的特征向量 34 end
测试:
cls1_data=[2.95 6.63;2.53 7.79;3.57 5.65;3.16 5.47]; cls2_data=[2.58 4.46;2.16 6.22;3.27 3.52]; %样本投影前 plot(cls1_data(:,1),cls1_data(:,2),\'.r\'); hold on; plot(cls2_data(:,1),cls2_data(:,2),\'*b\'); hold on; W=FisherLDA(cls1_data,cls2_data); %样本投影后 new1=cls1_data*W; new2=cls2_data*W; k=W(2)/W(1); plot([0,6],[0,6*k],\'-k\'); axis([2 6 0 11]); hold on; %画出样本投影到子空间点 for i=1:4 temp=cls1_data(i,:); newx=(temp(1)+k*temp(2))/(k*k+1); newy=k*newx; plot(newx,newy,\'*r\'); end; for i=1:3 temp=cls2_data(i,:); newx=(temp(1)+k*temp(2))/(k*k+1); newy=k*newx; plot(newx,newy,\'ob\'); end;
结果: