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 的人有什么想法吗?谢谢。
它不起作用,因为您的协方差矩阵不是正定的。要查看矩阵是否为正定矩阵,您可以检查其所有特征值是否都大于零。
极端案例
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
| 归档时间: |
|
| 查看次数: |
8145 次 |
| 最近记录: |