scipy 如何在Python / Matplotlib中根据特征值和特征向量绘制椭圆?

35g0bw71  于 2022-11-10  发布在  Python
关注(0)|答案(2)|浏览(223)

给定一个二维数据集,我想在数据周围画一个椭圆。为此,我首先计算协方差矩阵及其相关的特征值:

cov = np.cov(X.T)
eigenvalues, eigenvectors = np.linalg.eig(cov)

现在我想用matplotlib在两个特征向量周围画一个椭圆,但是我想不出怎么画。我想某种投影(例如点积)是必要的吧?
任何帮助都将不胜感激!

gpnt7bae

gpnt7bae1#

我取了一个任意的对称矩阵,你可以很容易地改变它。

import numpy as np
import matplotlib.pyplot as plt

# I'm taking an arbitrary symmetric matrix

COV = np.array([[1, -0.7],
                [-0.7, 4]])

eigenvalues, eigenvectors = np.linalg.eig(COV)
theta = np.linspace(0, 2*np.pi, 1000);
ellipsis = (1/np.sqrt(eigenvalues[None,:]) * eigenvectors) @ [np.sin(theta), np.cos(theta)]
plt.plot(ellipsis[0,:], ellipsis[1,:])

为了理解为什么这些方程会给予你想要的椭圆,你必须熟悉一般(矩阵)形式的椭圆方程:

其思想是计算椭圆参考中每个轴的大小,其由下式给出:

然后传递到笛卡尔坐标系。(我们以参数形式绘制)

uelo1irk

uelo1irk2#

根据您的示例,我将在此处创建一些数据

import numpy as np;
X = np.random.randn(100, 2)
X[:,1] += 0.3 * X[:,0]
cov = np.cov(X.T)
eigenvalues, eigenvectors = np.linalg.eig(cov)

特征值表示每个轴上的方差增益。因此,输出分布的等值线的轴长度与特征值(标准差)的平方根成正比。
要绘制椭圆,可以使用参数方程

import matplotlib.pyplot as plt;
theta = np.linspace(0, 2*np.pi, 1000);
ellipsis = (np.sqrt(eigenvalues[None,:]) * eigenvectors) @ [np.sin(theta), np.cos(theta)]
plt.plot(ellipsis[0,:], ellipsis[1,:])

相关问题