绘制特征向量e1&;matlab中的e2?

绘制特征向量e1&;matlab中的e2?,matlab,matrix,plot,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--'); p

如何在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--');
这是我得到的输出

这两行代表e1和e2。

如何正确绘制e1和e2???

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

plot3(10*[0 e1(1)], [0 e1(2)], [0 e1(3)],'b--');
plot3(10*[0 e2(1)], [0 e2(2)], [0 e2(3)],'g--');
您可能需要更改视图以获得良好的透视图。为此,您可以使用查看功能,或单击地物工具栏中的“旋转3D”图标(圆形箭头)


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

如果需要缩放的特征向量:

sc_vec = vec*val;
z = zeros(1,3);
plot3([z;sc_vec(1,:)],[z;sc_vec(2,:)],[z;sc_vec(3,:)],'b')
另一个选项是用于获取带有箭头的线:

scale = 1;
z = zeros(1,3);
quiver3(z,z,z,vec(1,:),vec(2,:),vec(3,:),scale,'g')
只是不要期望箭头看起来总是完美的,因为Matlab在这方面不是特别擅长

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

您可以使用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);

您使用
eig
而不是
eig
有特殊原因吗?如果没有,那么您应该坚持使用
eig
。仅供参考。无论是eig还是eig都会给我同样错误的结果!!虽然您的问题是绘图,但没有区别?这是什么意思“e1=[zero(size(vec(:,1)))、vec(:,1)];e1=e1/norm(e1)*4;”。。为什么有3行,但在普通PCA中,我们只需要2列eig向量(e1和e2)??对不起@user3303896,我没有意识到这一点。我认为把这三个矢量作为正交基来绘制更为清晰。通过这一行,我创建了一个矩阵,第一行为零,第二行为特征向量的值,因此我可以使用矩阵的列来绘制带有
plot3
的向量。如果您不需要第三个,您可以跳过e3的定义并打印它。这个“e1=e1/norm(e1)*4”如何?它是一个重缩放,仅用于打印目的。我猜特征向量的范数已经等于1了。我的意思是,什么是范数?为什么有4个?为什么你用范数把e1和4相乘?所以,eig比eig好得多??这是什么意思“plot3([z;vec(1,:)]”嗨,我试过你的代码。缩放前后的特征向量没有什么不同scalling@user3303896:
[z;vec(1,:)]
只是一个矩阵,包含要绘制的线的x坐标(与y-和z-类似。第一行为全零,因为向量起源于原点(
randn
的平均值)第二行是由
eig
返回的所有三个特征向量的x坐标。是的,
eig
eig
好,除非您试图解决特殊类型的问题。@user3303896:您没有看到任何区别,因为在这种情况下,向量是按特征值缩放的,所有特征值都是相同的很可能非常接近。有一个区别,但不是很大。通过本征值的缩放通过显示大小给出了更多的物理意义,但是如果你只是对本征向量的方向感兴趣的话,你也可以像其他答案一样缩放某个大常数。当然,你可以两者都做。嗨,你知道我有吗我的特征向量是负值,我应该怎么做?因为我无法绘制它!!我知道如果我的特征向量是负值,我应该怎么做吗?因为我无法绘制它!!你可以绘制负值和正值。我没有看到任何问题…?我试图生成正态分布值,所以我确定均值和方差。所以我可以把负特征向量看作正值。对于EX:E1= [-0.0925,0.7679,-0.6338 ]的第一列。.我可以用-1乘以它,对吗?@user3303896你可以用任何数字乘以特征向量,轴是相同的。如果数字是负数,轴会反转,但它的方向会保持不变,我知道..只有方向会改变。但是当我试着绘制它时..没有任何特征值..即使对于e2,1有1个负元素。我使用此代码plot3(10*[0 e1(1)],[0 e1(2)],[0 e1(3)],'b--');但我无法绘制e1和e2。如果生成非正态矩阵,则情况不同
  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);