参考本教程: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的人有什么想法吗?谢谢。
答案 0 :(得分:3)
从接受的答案中取出符号:
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
时爆炸。
答案 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)
非正定案例:
如果你再往前走......
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