在我编写的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) )
答案 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
的分布相等,其中b
和a*w1 + b*w2
是独立的高斯标量随机变量零均值和方差w1