Python 协方差矩阵的主轴与其角度不一致
我试图得到协方差的长轴(梯度和截距)。我用排序后的特征向量来计算椭圆的角度,但是当我画出椭圆与长轴相对的结果时,它们没有对齐 有人有什么想法吗Python 协方差矩阵的主轴与其角度不一致,python,numpy,statistics,covariance,eigenvector,Python,Numpy,Statistics,Covariance,Eigenvector,我试图得到协方差的长轴(梯度和截距)。我用排序后的特征向量来计算椭圆的角度,但是当我画出椭圆与长轴相对的结果时,它们没有对齐 有人有什么想法吗 import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Ellipse def eigsorted(cov): vals, vecs = np.linalg.eigh(cov) order = vals.argsort()[::-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
def eigsorted(cov):
vals, vecs = np.linalg.eigh(cov)
order = vals.argsort()[::-1]
return vals[order], vecs[:,order]
def orientation_from_covariance(cov, sigma):
vals, vecs = eigsorted(cov)
theta = np.degrees(np.arctan2(*vecs[:,0][::-1]))
w, h = 2 * sigma * np.sqrt(vals)
return w, h, theta
def plot_ellipse(ax, mu, covariance, color, linewidth=2, alpha=0.5):
x, y, angle = orientation_from_covariance(covariance, 2)
e = Ellipse(mu, x, y, angle=angle)
e.set_alpha(alpha)
e.set_linewidth(linewidth)
e.set_edgecolor(color)
e.set_facecolor(color)
e.set_fill(False)
ax.add_artist(e)
return e
from statsmodels.stats.moment_helpers import corr2cov
corr = np.eye(2)
corr[0, 1] = corr[1, 0] = 0.7
cov = corr2cov(corr, [1, 5])
mu = [1, 1]
vectors = eigsorted(cov)[1].T
gradients = [v[0] / v[1] for v in vectors]
intercepts = [mu[1] - (gradient*mu[0]) for gradient in gradients]
plt.scatter(*np.random.multivariate_normal(mu, cov, size=9000).T, s=1);
plot_ellipse(plt.gca(), mu, cov, 'k')
_x = np.linspace(*plt.xlim())
for i,g in zip(intercepts, gradients):
plt.plot(_x, i + (_x * g), 'k');
问题出在下面一行
#向量中v的梯度=[v[0]/v[1]#错误
梯度=[v[1]/v[0]表示向量中的v]#正确
因为梯度是y
相对于x
的变化。这个数字看起来像这样。
我还在绘图开始之前添加了plt.figure()
,在plt\u椭圆调用之后添加了plt.axis(“equal”)
我还想引用文件:
w:(…,M)Ndaray
按升序排列的特征值,每个特征值根据其多重性重复
因此,eigsorted
函数可以省略。如果我不将aspect设置为相等的话,您能解释一下为什么会失败吗?如果我想要一个不相等的比率呢?当然,从与椭圆相同的矩阵中导出的线应该以任何纵横比与椭圆对齐?如果轴不相等,则绘制的是不同的椭圆。例如,想象一个圆,它是一个相等轴的圆,但如果两个轴中的一个被加长,它实际上是一个椭圆。对于这个圆,线可以是线y=x
和y=-x
(任意)。现在,如果纵横比改变,正确的行将是x=0
和y=0
,因此我实际上认为纵横比在这里有影响。你介意接受答案,因为它解决了问题吗?等等。考虑到我绘制的直线是从与点相同的协方差矩阵导出的,它们应该始终对齐。在任何方面比我选择!忘记椭圆吧,直线应该始终与点的方向对齐。我不太确定你的论点。缩放绘图相当于将每个点乘以对角矩阵D
,因此缩放后的协方差将为D C D
(其中C
是旧协方差矩阵)。相反,直线的坡度将仅按D
进行缩放。我认为最好尝试在纸上计算一个简单的例子。如果你能证明dcd
的特征向量是C
的特征向量,只要按D
进行缩放,你就能真正证明你的主张。