令人困惑的np.random.multivariate_normal行为

时间:2018-04-03 07:45:55

标签: python numpy

我使用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 。我究竟做错了什么?

1 个答案:

答案 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允许的默认容差更远,并且该函数会发出警告。