LDA的思想:“投影后类内方差最小,类间方差最大”。即数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。
假设我们有两类数据分别为红色和蓝色,如下图所示,这些数据特征是二维的,我们希望将这些数据投影到一维的一条直线,让每一种类别数据的投影点尽可能的接近,而红色和蓝色数据中心之间的距离尽可能的大。
LDA将带有标签的数据降维,投影到低维空间同时满足三个条件:
- 尽可能多的保留数据样本的信息(即选择最大的特征是对应的特征向量所代表的方向)。
- 寻找最佳投影方向以更好区分不同类样本。
- 投影后使得同类样本尽可能近,不同类样本尽可能远。
📚描述
在本练习中,您需要实现线性判别分析(LDA)。
📚数据
在这个练习中,在ex3red.dat中有14行(x,y)红点,在ex3blue.dat和ex3green.dat中分别有14行蓝点和绿点。您应该使用它们来实现LDA。
📚LDA
🐇二维LDA
在本节中,需要实现2个类的LDA。这里我们选择对这两个类使用红点和蓝点。您应该将数据加载到矩阵中,并绘制它们:
x1=load('ex3red.dat');
x2=load('ex3blue.dat');
x3=load('ex3green.dat');
figure
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
xlabel('x');
ylabel('y');
xlim([0.00 10.00])
ylim([0.00 10.00])
m1=mean(x1);
m2=mean(x2);
Sb=(m1-m2)'*(m1-m2);
Sw=(x1-m1)'*(x1-m1)+(x2-m2)'*(x2-m2);
[V,L]=eig(inv(Sw)*Sb);
[a,b]=max(max(L));
theta = Sw\(m1-m2)';
disp(theta)
figure
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
x=linspace(0,10,100);
y=(theta(2)/theta(1))*x;
plot(x,y,'black')
title('LDA for two-classes')
xlabel('x')
ylabel('y')
一旦您成功地完成了您的代码,LDA的结果应该如下所示:
k=theta(2)/theta(1);
s1=size(x1,1);
s2=size(x2,1);
x1_tag=[];
x2_tag=[];
for i=1:s1
y0=x1(i,2);
x0=x1(i,1);
xn=(k*(y0-b)+x0)/(k^2+1);
x1_tag=[x1_tag;xn];
end
y1_tag=k*x1_tag + b;
x1_final=[x1_tag y1_tag];
for i=1:s2
y0=x2(i,2);
x0=x2(i,1);
xn=(k*(y0-b)+x0)/(k^2+1);
x2_tag=[x2_tag;xn];
end
y2_tag=k*x2_tag + b;
x2_final=[x2_tag y2_tag];
figure
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
x=linspace(0,10,100);
y=(theta(2)/theta(1))*x + b;
plot(x,y,'black')
title('LDA for two-classes')
xlabel('x')
ylabel('y')
plot(x1_final(:,1),x1_final(:,2),'ro','markerfacecolor','r');
plot(x2_final(:,1),x2_final(:,2),'bo','markerfacecolor','b');
同时,可以将红点和蓝点投影到直线上,看到投影点如下:
🐇N维LDA
LDA可以为N个类实现。在本节中,您应该实现N个类的LDA,其中N为3。将所有的红、蓝、绿点加载到矩阵中,并绘制出它们。
x1=load('ex3red.dat');
x2=load('ex3blue.dat');
x3=load('ex3green.dat');
figure
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
plot(x3(:,1),x3(:,2),'gs','markerfacecolor','g');
xlabel('x');
ylabel('y');
title('scatter diagram of 3-classes');
xlim([0.00 10.00]);
ylim([0.00 10.00]);
计算类内散度矩阵和类间散度矩阵。绘制直线。
hold off
m1=mean(x1);%compute mean value
m2=mean(x2);
m3=mean(x3);
m=mean([x1;x2;x3]);
%LDA for 3-class
Sb=((m1-m)'*(m1-m)+(m2-m)'*(m2-m)+(m3-m)'*(m3-m))/3;%compute Between-class scatter
Sw=((x1-m1)'*(x1-m1)+(x2-m2)'*(x2-m2)+(x3-m3)'*(x3-m3))/3;%compute Within-class scatter
%LDA for N class where N=3
[V,L]=eig(inv(Sw)*Sb);
[a,b]=max(max(L));% The eigenvector corresponds to the largest eigenvalue.
theta = V(:,b);
k=theta(2)/theta(1);%calculate the slope
figure%figure 2
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
plot(x3(:,1),x3(:,2),'gs','markerfacecolor','g');
xlim([0.00 10.00]);
ylim([0.00 10.00]);
xlabel('x');
ylabel('y');
x=linspace(0,10,100);
y=k*x+b;
plot(x,y,'black')
title('LDA for 3-classes')
xlabel('x')
ylabel('y')
投影
hold off
s1=size(x1,1);
s2=size(x2,1);
s3=size(x3,1);
x1_tag=[];
x2_tag=[];
x3_tag=[];
for i=1:s1
y0=x1(i,2);
x0=x1(i,1);
xn=(k*(y0-b)+x0)/(k^2+1);
x1_tag=[x1_tag;xn];
end
y1_tag=k*x1_tag + b;
x1_final=[x1_tag y1_tag];
for i=1:s2
y0=x2(i,2);
x0=x2(i,1);
xn=(k*(y0-b)+x0)/(k^2+1);
x2_tag=[x2_tag;xn];
end
y2_tag=k*x2_tag + b;
x2_final=[x2_tag y2_tag];
for i=1:s3
y0=x3(i,2);
x0=x3(i,1);
xn=(k*(y0-b)+x0)/(k^2+1);
x3_tag=[x3_tag;xn];
end
y3_tag=k*x3_tag+b;
x3_final=[x3_tag y3_tag];
figure%third
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
plot(x3(:,1),x3(:,2),'gs','markerfacecolor','g');
xlim([0.00 10.00]);
ylim([0.00 10.00]);
x=linspace(0,10,100);
y=k*x+b;
plot(x,y,'black')
title('LDA for 3-classes')
xlabel('x')
ylabel('y')
plot(x1_final(:,1),x1_final(:,2),'ro','markerfacecolor','r');
plot(x2_final(:,1),x2_final(:,2),'bo','markerfacecolor','b');
plot(x3_final(:,1),x3_final(:,2),'go','markerfacecolor','g');