擅长:python、mysql、java
<p>理论上,你的矩阵是半正定的,几个特征值正好为零。但浮点数的计算引入了截断误差,导致某些特征值很小,但却<em>负</em>;因此,矩阵不是半正定的。</p>
<p>目前看来,警告可能会被忽略;但是NumPy文档说,在非psd情况下的行为是未定义的,所以我不想依赖于此。纠正浮点错误的一种方法是在<code>y_cov</code>中添加一个很小的单位矩阵倍数。例如,如下所示:</p>
<pre><code>min_eig = np.min(np.real(np.linalg.eigvals(y_cov)))
if min_eig < 0:
y_cov -= 10*min_eig * np.eye(*y_cov.shape)
</code></pre>
<p>增加一个固定的恒等式倍数,如1e-12,对所有合理的大小矩阵都有效,但对结果仍然无关紧要。</p>
<hr/>
<p>为了完整起见,复制问题的一种更简单的方法是:</p>
<pre><code>import numpy as np
x = np.random.normal(size=(5,))
y = np.outer(x, x)
z = np.random.multivariate_normal(np.zeros(5), y)
</code></pre>
<p>这会抛出同样的警告(概率很高)。</p>