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

Abd*_*tir 7 python numpy

我使用numpy从多变量法线中采样,如下所示.

mu = [0, 0]
cov = np.array([[1, 0.5], [0.5, 1]]).astype(np.float32)
np.random.multivariate_normal(mu, cov)
Run Code Online (Sandbox Code Playgroud)

它给了我以下警告.

运行时警告:协方差不是正的 - 半定的.

矩阵显然是PSD.但是,当我使用np.float64数组时,它工作正常.我需要协方差矩阵为np.float32.我究竟做错了什么?

kaz*_*ase 7

即使对于非常小的非对角线元素> 0,也会发出警告.默认公差值似乎不适用于32位浮点数.

作为一种解决方法,对函数传递更高的容差:

np.random.multivariate_normal(mu, cov, tol=1e-6)
Run Code Online (Sandbox Code Playgroud)

细节

np.random.multivariate_normal通过首先用一个分解它来检查协方差是否为PSD (u, s, v) = svd(cov),然后检查重建np.dot(v.T * s, v)是否足够接近原始cov.

随着float32重建的结果进一步偏离1e-8允许的默认容差,并且该函数引发警告.

  • @AbdulFatir 是的,我会这么认为。 (2认同)