Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 试图绘制二元正态分布的等高线,won';不适用于相关项_Python_Matplotlib_Plot_Gaussian - Fatal编程技术网

Python 试图绘制二元正态分布的等高线,won';不适用于相关项

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

请参阅本教程:

以下是来自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有任何其他值,我得到一个

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()。