【问题标题】:plotting the Eigenvectors correctly in Matlab在 Matlab 中正确绘制特征向量
【发布时间】:2017-12-25 01:19:56
【问题描述】:

我正在尝试绘制二维数据集的计算特征向量,这里是我为此编写的脚本:

clear ;
s  = [2 2] 
set = randn(200,1);
x = normrnd(s(1).*set,1)+3
x = zscore(x) % Standardize
y = normrnd(s(1).*set,1)+2
y= zscore(y)%Standardize
x_0 = mean(x)
y_0 = mean (y) 
c = linspace(1,100,length(x)); % color

scatter(x,y,100,c,'filled')
xlabel('1st Feature : x')
ylabel('2nd Feature : y')
title('2D_dataset')

grid on
% gettign the covariance matrix 
covariance = cov([x,y])
% getting the eigenvalues and the  eigenwert 
[eigen_vector, eigen_values] = eig(covariance) 
eigen_value_1 = eigen_values(1,1) 
eigen_vector_1 =eigen_vector(:,1)
eigen_value_2 = eigen_values(2,2) 
eigen_vector_2 =eigen_vector(:,2)

% ploting the eigenvectors ! 
hold on 
x_0 = repmat(x_0,size(eigen_vector_2,1),1);
y_0 = repmat(y_0,size(eigen_vector_1,1),1);
quiver(x_0, y_0,eigen_vector_2*(eigen_value_2),eigen_vector_1*(eigen_value_1),'-r','LineWidth',5)

这是我得到的结果:

我已经仔细检查了数学,数值是正确的,但情节是一团糟! 知道我在 2 个向量的图中缺少什么吗? 提前致谢!

【问题讨论】:

    标签: matlab plot pca eigenvector


    【解决方案1】:

    在您的代码中,替换这部分:

    covariance = cov([x,y])
    % getting the eigenvalues and the  eigenwert 
    [eigen_vector, eigen_values] = eig(covariance) 
    eigen_value_1 = eigen_values(1,1) 
    eigen_vector_1 =eigen_vector(:,1)
    eigen_value_2 = eigen_values(2,2) 
    eigen_vector_2 =eigen_vector(:,2)
    
    % ploting the eigenvectors ! 
    hold on 
    x_0 = repmat(x_0,size(eigen_vector_2,1),1);
    y_0 = repmat(y_0,size(eigen_vector_1,1),1);
    quiver(x_0, y_0,eigen_vector_2*(eigen_value_2),eigen_vector_1*(eigen_value_1),'-r','LineWidth',5)
    

    使用以下代码:

    covariance = cov([x,y]);
    [eigen_vector, eigen_values] = eig(covariance);
    eigen_vector_1 = eigen_vector(:,1);
    eigen_vector_2 = eigen_vector(:,2);
    d = sqrt(diag(eigen_values));
    
    hold on;
    quiver(x_0,y_0,eigen_vector(1,2),eigen_vector(2,2),d(2),'k','LineWidth',5);
    quiver(x_0,y_0,eigen_vector(1,1),eigen_vector(2,1),d(1),'r','LineWidth',5);
    hold off;
    

    这会产生您正在寻找的东西吗?它对我来说看起来更加连贯......

    【讨论】:

    • 再次感谢您的帮助,但我就是不明白您为什么要使用 sqrt ?
    • 因为每个特征向量的缩放值是对应特征值的sqrt。 visiondummy.com/2014/04/…
    【解决方案2】:

    您将一个特征向量的两个分量绘制为两个向量的 x 分量,将另一个特征向量绘制为 y 分量。

    [eigen_vector, eigen_values] = eig(covariance) 
    eigen_x = eigen_vector(1,:);
    eigen_y = eigen_vector(2,:);
    scale = diag(eigen_vector)'; % not sure what the output orientation is
    
    % ploting the eigenvectors ! 
    hold on 
    x_0 = repmat(x_0,size(eigen_vector_2,1),1);
    y_0 = repmat(y_0,size(eigen_vector_1,1),1);
    quiver(x_0, y_0,eigen_x.*scale,eigen_y.*scale,'-r')
    

    实际上,因为它们是正交的,所以以另一种方式切片矩阵并没有太大变化。但是由于我上面提到的,您的缩放正在改变向量的角度,而不仅仅是它们的长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 2011-07-03
      相关资源
      最近更新 更多