线投影 - 线性判别分析

时间:2016-03-19 16:06:49

标签: algorithm matlab machine-learning linear-algebra linear-regression

我有两个问题。 我有附加的线性判别分析代码,它涉及两个类 - 两个特征。这是最基本的一个。 然而,

我不知道为什么我的预测线与教程不一样。请告诉我在附加的pdf方面我做了哪些错误的实现。

http://research.cs.tamu.edu/prism/lectures/pr/pr_l10.pdf http://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]

1 个答案:

答案 0 :(得分:0)

  

我不知道如何预测两个班级之间的界线。我看到的一些解决方案,他们使用特征值和向量来确定投影线,而其他一些解决方案则不需要通过确定特征值。为什么协方差矩阵的秩是重要的?

特征值用于反转矩阵,你可能也在inv(sw)调用中使用了特征分解。这对于该方法并不重要,您可以通过多种方式反转矩阵。

  

作为问题一的结果,我怎样才能投射出一等和二等数据。我的意思是如何绘制它们。

提供的图片有点误导。实际上,"线"你投射到的(超平面)应该越过原点(0,0)点。他们将其移走的事实只是任意决定 - 方法本身不支持。超平面的方程存储在v向量中,它以规范形式给出,因此

v_0 x + v_1 y = 0

是您要寻找的线路。有很多方法可以用规范形式绘制线条。其中一个(假设它不是恒定的)是以高中形式表达它":

y = - v_0 / v_1 * x

如果v_1不为0,显然有效,如果是,则您的线只是X轴。