Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 协方差矩阵的主轴与其角度不一致_Python_Numpy_Statistics_Covariance_Eigenvector - Fatal编程技术网

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
进行缩放,你就能真正证明你的主张。