【发布时间】: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