在我正在编写的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 的向量。我可以忽略这个警告吗?从文档中 https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.random.multivariate_normal.html:
请注意,协方差矩阵必须是半正定的(也称为非负定的)。否则,该方法的行为是未定义的,并且不能保证向后兼容性。
编辑:
这是一个完全可以运行的东西。感谢@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) )