试图绘制二元正常的轮廓,不适用于相关项

时间:2014-11-26 00:39:17

标签: python matplotlib plot gaussian

参考本教程:http://matplotlib.org/1.4.0/examples/pylab_examples/contour_demo.html

以下是来自mplotlib.mlab的bivariate_normal函数的原型:

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的人有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:3)

从接受的答案中取出符号:

cov_test = np.array([[..., ...],
                     [..., ...]])

您需要传递标准差(在参数sigmaxsigmay中),而不是方差:

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时爆炸。

答案 1 :(得分:1)

它不起作用,因为你的协方差矩阵不是正定的。要查看矩阵是否为正定,您可以检查其所有特征值是否都大于零。

极端情况

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 + 00 1.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)

enter image description here

非正定案例

如果你再往前走......

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