绘图特征向量e1& e2在matlab中?

时间:2014-02-18 22:24:44

标签: matlab matrix plot

如何能够在Matlab中绘制特征向量,确保它具有确切的位置作为我们数据的新轴?

这是我的PCA代码

  a= randn(100,3); 
  b=mean(a);
  c=cov(a); 


  [vec,val] = eigs(c);
  e1=vec(:,1); 
  e2=vec(:,2); 


  plot3(a(:,1),a(:,2),a(:,3),'ro');
  hold on
  %% Here is the Problem begins
  plot(e1,'k--');
  plot(e2,'k--');

这是我得到的输出 enter image description here

这两行代表e1& e2 如何绘制e1& e2正确???

3 个答案:

答案 0 :(得分:1)

您可以使用eig的输出直接绘制所有三个特征向量(或子集):

a = randn(100,3); 
b = mean(a);
c = cov(a); 

[vec,val] = eig(c);

plot3(a(:,1),a(:,2),a(:,3),'ro');
hold on

z = zeros(1,3);
% plot3([z(1:2);vec(1,1:2)],[z(1:2);vec(2,1:2)],[z(1:2);vec(3,1:2)],'k')
plot3([z;vec(1,:)],[z;vec(2,:)],[z;vec(3,:)],'k')
axis equal
grid on

如果你想要缩放的特征向量:

sc_vec = vec*val;
z = zeros(1,3);
plot3([z;sc_vec(1,:)],[z;sc_vec(2,:)],[z;sc_vec(3,:)],'b')

另一个选择是使用quiver3获取带箭头的行:

scale = 1;
z = zeros(1,3);
quiver3(z,z,z,vec(1,:),vec(2,:),vec(3,:),scale,'g')

不要指望箭头总是看起来很完美,因为Matlab在这方面并不是特别擅长。

请注意,eig可能会以与eigs不同的顺序返回特征值和-vectors,但它是您应该使用的函数。 eigs是一个专门的函数,它以不同的方式解决了特征问题,并且效率低得多。

答案 1 :(得分:0)

要表示每个向量,请使用plot3绘制从原点到向量定义的坐标的线,也许乘以一个大数字(我在示例中使用10)以使线条更长: / p>

plot3(10*[0 e1(1)], [0 e1(2)], [0 e1(3)],'b--');
plot3(10*[0 e2(1)], [0 e2(2)], [0 e2(3)],'g--');

您可能需要更改视图以获得良好的视角。为此,您可以使用view功能,或单击图工具栏中的“旋转3D”图标(圆形箭头)。

enter image description here

答案 2 :(得分:0)

您可以使用plot3

  a= randn(100,3); 
  b=mean(a);
  c=cov(a); 

  [vec,val] = eigs(c);

  e1=[zeros(size(vec(:,1))),vec(:,1)]'; e1 = e1/norm(e1)*4;
  e2=[zeros(size(vec(:,2))),vec(:,2)]'; e2 = e2/norm(e2)*4;
  e3=[zeros(size(vec(:,3))),vec(:,3)]'; e3 = e3/norm(e3)*4;

  plot3(a(:,1),a(:,2),a(:,3),'ro');
  hold on
  %% Here is the Problem begins
  plot3(e1(:,1),e1(:,2),e1(:,3),'k','LineWidth',2);
  plot3(e2(:,1),e2(:,2),e2(:,3),'b','LineWidth',2);
  plot3(e3(:,1),e3(:,2),e3(:,3),'g','LineWidth',2);

enter image description here