【问题标题】:Orthogonal Vectors Not Plotting Orthogonally (PCA in Python)不正交绘制的正交向量(Python 中的 PCA)
【发布时间】:2020-05-19 16:42:10
【问题描述】:

我正在尝试在 Python 中实现 PCA,但是当我用主轴注释我的图形时,我的向量似乎不是正交的。

import numpy as np
import matplotlib.pyplot as plt 
import scipy.linalg as LA

N = 1000
xTrue = np.linspace(0, 1000, N)
yTrue = 4 * xTrue
xData = xTrue + np.random.normal(0, 100, N)
yData = yTrue + np.random.normal(0, 100, N)
xData = np.reshape(xData, (N, 1))
yData = np.reshape(yData, (N, 1))
Data = np.hstack((xData, yData))

C = np.cov(Data, rowvar = False)
e_vals, e_vecs = LA.eig(C)
e_vals = np.real(e_vals)
e_vecs = -e_vecs

avg = (1/Data.shape[0] )*sum(Data, 0)

arrowprops = dict(arrowstyle = '->', linewidth = 3, shrinkA = 0, shrinkB = 0, color = 'r')
plt.scatter(Data[:,0], Data[:,1])
plt.title("Principal Component Analysis Example: Linear Data")
for i in [0,1]:
    ax = plt.gca()
    ax.annotate('', avg + np.sqrt(e_vals[i])*e_vecs[:,i], avg, arrowprops = arrowprops)

我可以通过证明np.matmul(e_vecs, e_vecs.T) 大致是一个单位矩阵来验证我的特征向量是正交的。但是我得到的图像如下:

很明显,图像中的向量不是正交的,但是为什么它们不正交是没有意义的,因为通过向量avg 翻译它们不应该消除这个属性。有人知道这有什么问题吗?这是缩放问题还是我遗漏了一些重要参数?

【问题讨论】:

  • 你确定向量是 2 分量的吗?绘制的向量可以在 3D 空间中正交...
  • @WilliamMiller 我不相信是这样的。数据只有两个分量,对应的协方差矩阵为 2x2。我知道如果我从 3x3 问题开始,然后尝试错误地投影到某个平面上,会发生这种情况,但这不是这里发生的事情。

标签: python matplotlib pca


【解决方案1】:

向量是相互正交的,但是当您绘制它们时,由于绘图的比例,它们看起来并不正交(x 轴范围远小于 y 轴范围)。如果情节的方面通过matplotlib.axes.Axes.set_aspect 设置为'eqaul',这将变得很清楚:

for i in [0,1]:
    ax = plt.gca()
    ax.set_aspect('equal')
    ax.annotate('', avg + np.sqrt(e_vals[i])*e_vecs[:,i], avg, arrowprops = arrowprops)

您当然可以反转向量的缩放比例,以强制它们在一组纵横比不相等的轴上视觉上正交,但这最终不能代表实际数据。我建议要么使用上面的set_aspect('equal') 将方面设置为'equal',要么只是注意到向量是正交的,但由于绘图的方面而不是正交绘图。

【讨论】:

  • 谢谢。我想我迷路了,因为我正在使用的变量的缩放比例非常不同,所以实际上在等轴上查看它们并不是那么有利。我只是想确保我没有失去理智和错误地规划事情。
  • @Mnifldz 没问题,很高兴我能确认这是为你缩放的结果
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2013-06-22
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多