numpy positive半明确警告

时间:2017-01-06 22:39:14

标签: python numpy simulation

在我编写的Python脚本中,我正在使用表达式模拟多元正态随机向量

np.random.multivariate_normal(np.zeros(dim_obs), y_cov)

我的脚本运行,但会生成以下警告:

RuntimeWarning: covariance is not positive-semidefinite.

我投入的小调试打印语句大部分时间都打印False

print( np.all(np.linalg.eigvals(y_cov) > 0) )

为什么这会引发误报?我的y_cov是正半正定的,因为它是(抱歉缺少TeX标记)B x x' B' + y y'其中B是矩阵,其他是随机向量,每个元素都是正数。

在这个特定的运行中,B实际上只是一个大小为9的向量。我可以忽略这个警告吗? From the documentation

  

请注意,协方差矩阵必须是半正定(a.k.a. nonnegative-definite)。否则,此方法的行为未定义,并且无法保证向后兼容性。

编辑: 这是一个完全可以运行的东西。感谢您提示@ user2357112。

import numpy as np
num_factors = 1
dim_obs = 9
u = np.random.normal(size = num_factors)
v = np.random.normal(size = dim_obs)
y_cov = np.dot(np.ones((9,1)), np.exp(u.reshape((num_factors,1))/2))
y_cov = np.dot(y_cov, np.exp(u.reshape((1,num_factors))/2)) #transpose
y_cov = np.dot(y_cov, np.transpose(np.ones((9,1))))
y_cov += np.dot(np.exp( v.reshape((dim_obs,1)) / 2), 
                np.exp( v.reshape((1,dim_obs)) / 2))
print( np.random.multivariate_normal(np.zeros(dim_obs), y_cov) )
print( np.all(np.linalg.eigvals(y_cov) > 0) )
print( np.linalg.eigvals(y_cov)  )

2 个答案:

答案 0 :(得分:9)

理论上,你的矩阵是半正定的,有几个特征值恰好为零。但是浮点数的计算会引入截断误差,导致其中一些特征值非常小但;因此,矩阵不是半正的。

暂时看来警告可能会被忽略;但NumPy文档说非psd情况下的行为是未定义的,所以我不想依赖于此。纠正浮点错误的一种方法是将单位矩阵的一小部分加到y_cov。例如,像这样:

min_eig = np.min(np.real(np.linalg.eigvals(y_cov)))
if min_eig < 0:
    y_cov -= 10*min_eig * np.eye(*y_cov.shape)

添加固定倍数的身份,如1e-12,适用于所有合理大小的矩阵,但仍然不会对结果产生影响。

为了完整性,可以更简单地重现问题:

import numpy as np
x = np.random.normal(size=(5,))
y = np.outer(x, x)
z = np.random.multivariate_normal(np.zeros(5), y)    

这会发出相同的警告(概率很高)。

答案 1 :(得分:4)

在你的情况下生成高斯样本的一种更有效的方法,也不受@zaq识别的数值问题的影响,是观察到一个多变量,零均值高斯随机向量,协方差矩阵等于{{1} } {( <!DOCTYPE html> <html> <title>W3.CSS</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="http://www.w3schools.com/lib/w3.css"> <body> <div class="w3-container"> <h2>Accordions</h2> <p>An accordion is used to show (and hide) content that is broken into sections:</p> <div class="w3-accordion w3-light-grey"> <button onclick="myFunction('Demo1')" class="w3-btn-block w3-left-align w3-show">Open Section 1</button> <div id="Demo1" class="w3-accordion-content w3-container w3-show"> <h4>Section 1</h4> <p>Some text..</p> </div> <button onclick="myFunction('Demo2')" class="w3-btn-block w3-left-align w3-show">Open Section 2</button> <div id="Demo2" class="w3-accordion-content w3-container w3-show"> <h4>Section 2</h4> <p>Some other text..</p> </div> </div> </div> <script> function myFunction(id) { var x = document.getElementById(id); if (x.className.indexOf("w3-show") == -1) { x.className += " w3-show"; } else { x.className = x.className.replace(" w3-show", ""); } } </script> </body> </html> a*a.T + b*b.T:列向量)与随机向量a的分布相等,其中ba*w1 + b*w2是独立的高斯标量随机变量零均值和方差w1