如何能够在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正确???
答案 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”图标(圆形箭头)。
答案 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);