我试图获得协方差的主轴(梯度和截距)。我正在使用排序的特征向量来计算椭圆的角度,但是当我针对主轴绘制生成的椭圆时,它们没有对齐。有没有人有任何想法?import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.patches import Ellipsedef 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, thetadef 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 efrom statsmodels.stats.moment_helpers import corr2covcorr = np.eye(2)corr[0, 1] = corr[1, 0] = 0.7cov = corr2cov(corr, [1, 5])mu = [1, 1]vectors = eigsorted(cov)[1].Tgradients = [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');
1 回答
蛊毒传说
TA贡献1895条经验 获得超3个赞
问题是以下行
# gradients = [v[0] / v[1] for v in vectors] # wrong gradients = [v[1] / v[0] for v in vectors] # correct
因为梯度是 的变化y
超过 的变化x
。该图看起来像这样。
我还在plt.figure()
绘图开始之前和通话plt.axis("equal")
之后添加了plot_ellipse
。
我还想引用numpy.linalg.eigh文档:
w : (..., M) ndarray
按升序排列的特征值,每个都根据其多重性重复。
因此eigsorted
可以省略该功能。
添加回答
举报
0/150
提交
取消