不正交绘制正交向量(Python中为PCA)

问题描述 投票:1回答:1

我正在尝试用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)大致是一个单位矩阵来验证我的特征向量是正交的。但是我得到的图像如下:

enter image description here

显然,向量在图像中不是正交的,但是为什么它们不是正交的,这是没有道理的,因为通过向量avg对其进行平移不应消除该属性。有人知道这是怎么回事吗?这是缩放问题还是我缺少一些重要参数?

python matplotlib pca
1个回答
0
投票

向量是相互正交的,但是当您绘制它们时,由于图的比例(x轴范围比y轴范围小得多),它们不会显得正交。如果通过'eqaul'将绘图的纵横比设置为matplotlib.axes.Axes.set_aspect,这将变得很清楚:

matplotlib.axes.Axes.set_aspect

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)

当然,您可以反转向量的缩放比例,以强制它们在纵横比不相等的一组轴上在视觉上正交,但最终并不能代表实际数据。我建议使用上面的enter image description here或将长宽比设置为'equal',或者简单地指出向量是正交的,但由于绘制的长宽比不要正交绘制。]

© www.soinside.com 2019 - 2024. All rights reserved.