我使用numpy从多变量法线中采样如下。
mu = [0, 0]
cov = np.array([[1, 0.5], [0.5, 1]]).astype(np.float32)
np.random.multivariate_normal(mu, cov)
它给了我以下警告。
运行时警告:协方差不是正半无限的。
矩阵显然是PSD。但是,当我使用 np.float64 数组时,它可以正常工作。我需要协方差矩阵 np.float32 。我究竟做错了什么?
答案 0 :(得分:7)
即使对于非常小的非对角线元素,也会发出警告> 0.默认容差值似乎不适用于32位浮点数。
作为一种解决方法,对函数传递更高的容差:
np.random.multivariate_normal(mu, cov, tol=1e-6)
<强>详情
np.random.multivariate_normal
通过首先使用(u, s, v) = svd(cov)
对其进行分解来检查协方差是否为PSD,然后检查重建np.dot(v.T * s, v)
是否足够接近原始cov
。
使用float32
重建的结果比1e-8
允许的默认容差更远,并且该函数会发出警告。