我有两个问题。我有用于线性判别分析的附加代码,它处理两个类 - 每个类两个特征。这是最基本的一个。然而
我不知道为什么我的投影线与教程不同。请告诉我我对所附pdf的错误实现在哪里。
http://research.cs.tamu.edu/prism/lectures/pr/pr_l10.pdfhttp://www.di.univr.it/documenti/OccorrenzaIns/matdid/matdid437773.pdf
% Fisher's linear discriminant.
% : xi is column vector of which element is test metric.
% Therefore size of row is the number of test metrics.
% Number of column is the number of data sets.
% x1 = rand(2, 30) + 0.75.*ones(2,30); %[d1(:,c1) d1(:,c2)]';
% x2 = rand(2, 30) + 0.3 .*ones(2,30); %[d2(:,c1) d2(:,c2)]';
x1=[1 2;2 3;3 3;4 5;5 5]' % the first class 5 observations
x2=[1 0;2 1;3 1;3 2;5 3]' % the second class 6 observations
m1 = mean(x1')';
m2 = mean(x2')';
m = m1 + m2;
Sw1 = zeros(size(x1, 1), size(x1,1));
Sw2 = zeros(size(x1, 1), size(x1,1));
for i = 1:size(x1,1)
Sw1 = Sw1 + (x1(:,i)-m1)*(x1(:,i)-m1)';
end
for i = 1:size(x2,1)
Sw2 = Sw2 + (x2(:,i)-m2)*(x2(:,i)-m2)';
end
Sw = Sw1 + Sw2;
w = Sw^(-1)*(m2-m1);
scatter(x1(1,:), x1(2,:), 10, 'ro');
hold on;
scatter(x2(1,:), x2(2,:),10,'bo');
c = 0.5.*m; %Average mean.ie. m/2
quiver(c(1,1), c(2,1), 1, -w(1,1)/w(2,1));
quiver(c(1,1), c(2,1), -1, w(1,1)/w(2,1));
quiver(w(1,1),w(2,1), 0.5)
hold off;
figure;
y1 = x1'*w;
y2 = x2'*w;
hist([y1 y2])
newy=w'*newp;
%newp is new point
diff1=abs(m1-newy);
diff2=abs(m2-newy);
if diff1 >=diff2
%newp is included in class1
else
%newp is included in class2
It has to be something similar to the following picture
[![smthg simialr to the following final results][3]][3]
我不知道如何在两个类之间投影线。我看到的一些解决方案,他们使用特征值和矢量来确定投影线,而其他一些解决方案则不需要通过确定特征值。为什么协方差矩阵的秩很重要?
特征值用于反转矩阵,您可能还在调用中使用inv(sw)
特征分解。这对该方法并不重要,您可以通过多种方式反转矩阵。
作为问题一的结果,我如何预测一等和二等的数据。我的意思是我怎么能绘制它们。
提供的图像有点误导。实际上,您投影到的"线"(超平面)应该穿过原点 (0,0)。他们将其移走的事实只是武断的决定 - 方法本身不支持。超平面的方程存储在v
向量中,它以规范形式给出,因此
v_0 x + v_1 y = 0
是您正在寻找的行。 有很多方法可以以规范形式绘制线条。其中之一(假设它不是恒定的)是以"高中格式"表达它:
y = - v_0 / v_1 * x
这显然有效 iff v_1
不是 0,如果是,你的线只是 X 轴。