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

use*_*422 5 python plot gaussian matplotlib

参考本教程: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)
Run Code Online (Sandbox Code Playgroud)

X 和 Y 定义网格,我们有二维均值和协方差项的参数。如您所见,最后有一个关于 x 和 y 之间协方差的参数。事情是这样的:如果 sigmaxy = 0,plt.contour() 将绘制二元法线轮廓。但是,如果 sigmaxy 有任何其他值,我会得到一个

ValueError: zero-size array to reduction operation minimum which has no identity
Run Code Online (Sandbox Code Playgroud)

例如,

Z =  bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0, 0.0)
plt.contour(X,Y,Z)
Run Code Online (Sandbox Code Playgroud)

作品

但是,以下方法不起作用:

Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0, 1.0)
plt.contour(X,Y,Z)
Run Code Online (Sandbox Code Playgroud)

任何熟悉 matplotlib 的人有什么想法吗?谢谢。

alb*_*rto 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)
Run Code Online (Sandbox Code Playgroud)

[ 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

非正定情况

如果你再进一步的话......

import numpy as np
from matplotlib import pylab as plt

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

print np.linalg.eigvals(cov_test)
Run Code Online (Sandbox Code Playgroud)

[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)
Run Code Online (Sandbox Code Playgroud)

您收到错误:

ValueError: zero-size array to reduction operation minimum which has no identity`
Run Code Online (Sandbox Code Playgroud)

事实上,我Z现在充满了NaN