【问题标题】:scipy.stats.multivariate_normal raising `LinAlgError: singular matrix` even though my covariance matrix is invertiblescipy.stats.multivariate_normal 提高“LinAlgError:奇异矩阵”,即使我的协方差矩阵是可逆的
【发布时间】:2016-05-18 08:48:59
【问题描述】:

我在尝试使用 scipy.stats.multivariate_normal 时遇到问题,希望你们中的某个人能提供帮助。

我有一个 2x2 矩阵,可以找到使用 numpy.linalg.inv() 的逆矩阵,但是当我尝试将它用作 multivariate_normal 中的协方差矩阵时,我收到一个 LinAlgError 说明它是一个奇异矩阵:

In [89]: cov = np.array([[3.2e5**2, 3.2e5*0.103*-0.459],[3.2e5*0.103*-0.459, 0.103**2]])

In [90]: np.linalg.inv(cov)
Out[90]:
array([[  1.23722158e-11,   1.76430200e-05],
       [  1.76430200e-05,   1.19418880e+02]])

In [91]: multivariate_normal([0,0], cov)
---------------------------------------------------------------------------
LinAlgError                               Traceback (most recent call last)
<ipython-input-91-44a6625beda5> in <module>()
----> 1 multivariate_normal([0,0], cov)

/mnt/ssd/Enthought_jli199/Canopy_64bit/User/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in __call__(self, mean, cov, allow_singular, seed)
    421         return multivariate_normal_frozen(mean, cov,
    422                                           allow_singular=allow_singular,
--> 423                                           seed=seed)
    424
    425     def _logpdf(self, x, mean, prec_U, log_det_cov, rank):

/mnt/ssd/Enthought_jli199/Canopy_64bit/User/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in __init__(self, mean, cov, allow_singular, seed)
    591         """
    592         self.dim, self.mean, self.cov = _process_parameters(None, mean, cov)
--> 593         self.cov_info = _PSD(self.cov, allow_singular=allow_singular)
    594         self._dist = multivariate_normal_gen(seed)
    595

/mnt/ssd/Enthought_jli199/Canopy_64bit/User/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in __init__(self, M, cond, rcond, lower, check_finite, allow_singular)
    217         d = s[s > eps]
    218         if len(d) < len(s) and not allow_singular:
--> 219             raise np.linalg.LinAlgError('singular matrix')
    220         s_pinv = _pinv_1d(s, eps)
    221         U = np.multiply(u, np.sqrt(s_pinv))

LinAlgError: singular matrix

【问题讨论】:

  • 你使用哪个版本的 numpy?我可以在 numpy 1.10.1 上成功运行代码。请注意,尽管矩阵在技术上是可逆的,但它的缩放比例非常糟糕。
  • 嗨 kazemakase,它的版本是 1.9.2。

标签: python numpy scipy statistics linear-algebra


【解决方案1】:

默认情况下,multivariate_normal 检查协方差矩阵的任何特征值是否小于根据其 dtype 和最大特征值的大小选择的某个容差(查看 scipy.stats._multivariate._PSD 和 @987654322 的源代码@了解全部详情)。

正如上面提到的@kazemakase,虽然您的协方差矩阵根据np.linalg.inv 使用的标准可能是可逆的,但它仍然非常病态并且无法通过multivariate_normal 使用的更严格的测试。

您可以将allow_singular=True 传递给multivariate_normal 以跳过此测试,但通常最好重新调整您的数据以避免首先通过这种病态协方差矩阵。

【讨论】:

  • 嗨 ali_m,感谢您的帮助。我现在可以看到当我在 multivariate_normal 的源代码中进行检查时正在进行的检查。我将标准化我的数据以避免出现这种病态协方差矩阵。
猜你喜欢
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多