题目1 LDA分类器讨论
1.1 分类器的原理和算法流程
(1)原理:LDA分类器将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。
(2)流程: ①计算投影前与投影后的数据中心点
②计算散度矩阵,包括类内散度矩阵Sw和类间散度矩阵Sb
③计算的特征值和特征向量
④选择d个最大特征值对应的矩阵W
⑤对数据集D进行降维,得到Y
1.2 题目研究的工作基础或实验条件
(1)软件环境:office、matlab
1.3 设计思想
给出一组分好类的数据集,通过matlab软件依照LDA算法流程对手动推演的结果进行验证,对比最终结果。
1.4 流程图
1.5 主要程序代码(要求必须有注释)
%给出两类样本
cls1_data=[4 2;2 4;2 3;3 6;4 4];
cls2_data=[9 10;6 8;9 5;8 7;10 8];
%样本投影前的点
plot(cls1_data(:,1),cls1_data(:,2),'.r');
hold on;
plot(cls2_data(:,1),cls2_data(:,2),'*b');
hold on;
%通过调用FisherLDA函数求出最大特征值对应的特征向量
W=FisherLDA(cls1_data,cls2_data);
fprintf('the value of W is [%4.2f;%4.2f] ',W);
%样本投影直线
new1=cls1_data*W;
new2=cls2_data*W;
k=W(2)/W(1);
plot([0,12],[0,12*k],'-k');
axis([0 12 0 12]);
hold on;
%画出样本投影到直线上的点
for i=1:5
temp=cls1_data(i,:);
newx=(temp(1)+k*temp(2))/(k*k+1);
newy=k*newx;
plot(newx,newy,'*r');
end
for i=1:5
temp=cls2_data(i,:);
newx=(temp(1)+k*temp(2))/(k*k+1);
newy=k*newx;
plot(newx,newy,'ob');
end
function [W] = FisherLDA(w1,w2)
%W最大特征值对应的特征向量
%w1 第一类样本
%w2 第二类样本
%第一步:计算样本均值向量
m1=mean(w1);%第一类样本均值
m2=mean(w2);%第二类样本均值
m=mean([w1;w2]);%总样本均值
%第二步:计算类内散度矩阵Sw
n1=size(w1,1);%第一类样本数
n2=size(w2,1);%第二类样本数
%求第一类样本的散度矩阵s1
s1=0;
for i=1:n1
s1=s1+(w1(i,:)-m1)'*(w1(i,:)-m1);
end
%求第二类样本的散度矩阵s2
s2=0;
for i=1:n2
s2=s2+(w2(i,:)-m2)'*(w2(i,:)-m2);
end
Sw=(n1*s1+n2*s2)/(n1+n2);
%第三步:计算类间离散度矩阵Sb
Sb=(n1*(m-m1)'*(m-m1)+n2*(m-m2)'*(m-m2))/(n1+n2);
%第四步:求最大特征值和特征向量
%[V,D]=eig(inv(Sw)*Sb);%特征向量V,特征值D
A = repmat(0.1,[1,size(Sw,1)]);%repmat为创建所有元素值为0.1的1*size(Sw,1)的矩阵
B = diag(A);%生成对角阵
[V,D]=eig(inv(Sw + B)*Sb);%求矩阵的全部特征值构成对角阵D,并求矩阵的特征向量构成V的列向量
[a,b]=max(max(D));%a为列最大值,b为列最大值的行号
W=V(:,b);%最大特征值对应的特征向量W
end
1.6 运行结果及分析