- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在尝试使用 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
最佳答案
默认情况下,multivariate_normal
检查协方差矩阵的任何特征值是否小于根据其 dtype 和最大特征值的大小选择的某个公差(查看 scipy.stats._multivariate._PSD
的源代码和 scipy.stats._multivariate._eigvalsh_to_eps
的完整详细信息)。
正如@kazemakase 上面提到的,虽然根据 np.linalg.inv
使用的标准,您的协方差矩阵可能是可逆的,但它仍然是病态的并且无法通过使用的更严格的测试multivariate_normal
.
您可以将 allow_singular=True
传递给 multivariate_normal
以跳过此测试,但通常最好重新缩放数据以避免传递这种病态协方差矩阵放在首位。
关于python - scipy.stats.multivariate_normal 提高 `LinAlgError: singular matrix` 即使我的协方差矩阵是可逆的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35273908/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!