Python 试图绘制二元正态分布的等高线,won';不适用于相关项
请参阅本教程: 以下是来自mplotlib.mlab的双变量_正规函数的原型:Python 试图绘制二元正态分布的等高线,won';不适用于相关项,python,matplotlib,plot,gaussian,Python,Matplotlib,Plot,Gaussian,请参阅本教程: 以下是来自mplotlib.mlab的双变量_正规函数的原型: bivariate_normal(X, Y, sigmax=1.0, sigmay=1.0, mux=0.0, muy=0.0, sigmaxy=0.0) X和Y定义了网格,我们有关于二维均值和协方差项的参数。 正如你所看到的,在x和y之间的协方差的末尾有一个参数。事情是这样的: 如果sigmaxy=0,plt.contour()将绘制二元正态等高线。然而,如果sigmaxy有任何其他值,我得到一个 ValueEr
bivariate_normal(X, Y, sigmax=1.0, sigmay=1.0, mux=0.0, muy=0.0, sigmaxy=0.0)
X和Y定义了网格,我们有关于二维均值和协方差项的参数。
正如你所看到的,在x和y之间的协方差的末尾有一个参数。事情是这样的:
如果sigmaxy=0,plt.contour()将绘制二元正态等高线。然而,如果sigmaxy有任何其他值,我得到一个
ValueError: zero-size array to reduction operation minimum which has no identity
比如说,
Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0, 0.0)
plt.contour(X,Y,Z)
工作
但是,以下方法不起作用:
Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0, 1.0)
plt.contour(X,Y,Z)
熟悉matplotlib的人有什么想法吗?谢谢 它不起作用,因为协方差矩阵不是正定的。若要查看矩阵是否正定,可以检查其所有特征值是否大于零 极端情况
import numpy as np
from matplotlib.mlab import bivariate_normal
from matplotlib import pylab as plt
cov_test = np.array([[1,0.999],
[0.999,1]])
print np.linalg.eigvals(cov_test)
[1.99900000e+001.00000000e-03]
你可以看到第二个特征值非常接近于零。事实上,如果你绘制它,你会发现这是一个协方差的极端情况:
x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-3.0, 3.0, 0.1)
X, Y = np.meshgrid(x, y)
Z = bivariate_normal(X, Y, cov_test[0,0], cov_test[1,1], 0.0, 0.0, cov_test[0,1])
plt.contour(X,Y,Z)
Z = bivariate_normal(X, Y, np.sqrt(cov_test[0,0]), np.sqrt(cov_test[1,1]),
0.0, 0.0, cov_test[0,1])
非正定格:
如果你再往前走一点
import numpy as np
from matplotlib import pylab as plt
cov_test = np.array([[1,1],
[1,1]])
print np.linalg.eigvals(cov_test)
[2.0]
然后第二个特征值达到0,这不是正定值,如果您尝试绘制它,则:
x = np.arange(-3.0, 3.0, 0.1)
y = np.arange(-3.0, 3.0, 0.1)
X, Y = np.meshgrid(x, y)
Z = bivariate_normal(X, Y, cov_test[0,0], cov_test[1,1], 0.0, 0.0, cov_test[0,1])
plt.contour(X,Y,Z)
您将得到以下错误:
ValueError: zero-size array to reduction operation minimum which has no identity`
事实上,我的
Z
现在充满了NaN
从接受的答案中取符号:
cov_test = np.array([[..., ...],
[..., ...]])
您需要传递标准偏差(在参数sigmax
和sigmay
中),而不是方差:
Z = bivariate_normal(X, Y, np.sqrt(cov_test[0,0]), np.sqrt(cov_test[1,1]),
0.0, 0.0, cov_test[0,1])
无论出于何种原因,sigmaxy
参数是协方差矩阵中的实际条目(实际上是rho*sigmax*sigmay
)
对于任何非平凡的例子,如果您尝试传入所有协方差或所有sqrt协方差,则当代码尝试计算
rho
时,它将爆炸。您确定plt.contour
会引发错误吗?是不是双变量(正常)阻碍了你的输入?。不,不是。当我不绘制等高线并从二元_正规函数中获取值时,它工作得很好。我要试着写我自己的二元函数,试着画出来,也许到时候会有用。我只是不明白为什么不是。谢谢你的回答,但我实际上得到了这个错误,即使我的协方差矩阵是正定的(通过检查特征值确认)。你能想出这个错误发生的其他潜在原因吗?你的特征值是什么?我碰巧发现,如果它们太接近于零,它就会认为它是非正定的。让我看看你的矩阵,这样我就可以再试一次。顺便说一下,在二元_正规函数中,对于协方差矩阵的对角线,你应该使用平方值!在您的示例中,您将cov_测试[r,c]
传递到bivariate_normal()。