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

不正交绘制的正交向量(Python中的PCA),python,matplotlib,pca,Python,Matplotlib,Pca,我试图用Python实现PCA,但当我用主轴注释我的图形时,我的向量似乎不是正交的 将numpy导入为np 将matplotlib.pyplot作为plt导入 将scipy.linalg作为LA导入 N=1000 xTrue=np.linspace(0,1000,N) yTrue=4*xTrue 扩展数据=xTrue+np.random.normal(0,100,N) yData=yTrue+np.random.normal(0,100,N) 扩展数据=np.重塑(扩展数据,(N,1)) yDa

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

将numpy导入为np
将matplotlib.pyplot作为plt导入
将scipy.linalg作为LA导入
N=1000
xTrue=np.linspace(0,1000,N)
yTrue=4*xTrue
扩展数据=xTrue+np.random.normal(0,100,N)
yData=yTrue+np.random.normal(0,100,N)
扩展数据=np.重塑(扩展数据,(N,1))
yData=np.重塑(yData,(N,1))
数据=np.hstack((扩展数据,扩展数据))
C=np.cov(数据,rowvar=False)
e_vals,e_vecs=LA.eig(C)
e_vals=np.real(e_vals)
e_vecs=-e_vecs
平均值=(1/Data.shape[0])*sum(数据,0)
arrowprops=dict(arrowstyle='->',线宽=3,shrinkA=0,shrinkB=0,颜色='r')
plt.scatter(数据[:,0],数据[:,1])
plt.title(“主成分分析示例:线性数据”)
对于[0,1]中的i:
ax=plt.gca()
ax.注释(“”,平均+np.sqrt(e_vals[i])*e_vecs[:,i],平均,arrowprops=arrowprops)
我可以通过显示
np.matmul(e_vecs,e_vecs.T)
大致是一个单位矩阵来验证我的特征向量是正交的。然而,我得到的图像如下:


很明显,向量在图像中不是正交的,但是没有意义,因为通过向量
avg
转换向量不应该消除这个属性。有人知道这是怎么回事吗?这是一个缩放问题还是缺少一些重要参数?

矢量相互正交,但在打印时,由于打印的缩放比例(x轴范围比y轴范围小得多),它们看起来并不正交。如果通过以下方式将绘图的方向设置为
“eqaul”
,则这一点变得清晰:

[0,1]中的i的
:
ax=plt.gca()
ax.set_方面(“相等”)
ax.注释(“”,平均+np.sqrt(e_vals[i])*e_vecs[:,i],平均,arrowprops=arrowprops)


当然,您可以反转向量的缩放,以强制向量在一组轴上视觉正交,对于这些轴,纵横比是不相等的,但这最终将无法代表实际数据。我建议使用上面的
set_aspect('equal')
将aspect设置为
'equal'
,或者简单地注意向量是正交的,但由于绘图的方面,不正交绘图。

您确定向量是双分量的吗?绘制的向量可以在3D空间中正交…@WilliamMiller我不相信是这样的。数据只有两个分量,对应的协方差矩阵为2x2。我理解如果我从一个3x3问题开始,然后试图错误地投射到某个平面上,那会发生什么,但这不是这里发生的事情。谢谢。我想我迷路了,因为我正在处理的变量的缩放方式非常不同,所以实际上在相等的轴上查看它们并不那么有利。我只是想确保我并没有失去理智,并没有错误地绘制东西。@Mnifldz没问题,很高兴我能确认这是你们缩放的结果