我使用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.我究竟做错了什么?
即使对于非常小的非对角线元素> 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
允许的默认容差,并且该函数引发警告.