给定一个二维数据集,我想在数据周围画一个椭圆。为此,我首先计算协方差矩阵及其相关的特征值:
cov = np.cov(X.T) eigenvalues, eigenvectors = np.linalg.eig(cov)
现在我想用matplotlib在两个特征向量周围画一个椭圆,但是我想不出怎么画。我想某种投影(例如点积)是必要的吧?任何帮助都将不胜感激!
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,:])
为了理解为什么这些方程会给予你想要的椭圆,你必须熟悉一般(矩阵)形式的椭圆方程:
其思想是计算椭圆参考中每个轴的大小,其由下式给出:
然后传递到笛卡尔坐标系。(我们以参数形式绘制)
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,:])
2条答案
按热度按时间gpnt7bae1#
我取了一个任意的对称矩阵,你可以很容易地改变它。
为了理解为什么这些方程会给予你想要的椭圆,你必须熟悉一般(矩阵)形式的椭圆方程:
其思想是计算椭圆参考中每个轴的大小,其由下式给出:
然后传递到笛卡尔坐标系。(我们以参数形式绘制)
uelo1irk2#
根据您的示例,我将在此处创建一些数据
特征值表示每个轴上的方差增益。因此,输出分布的等值线的轴长度与特征值(标准差)的平方根成正比。
要绘制椭圆,可以使用参数方程