【问题标题】:scipy.stats.multivariable_norm.pdf: "The input matrix must be symmetric positive semidefinite."scipy.stats.multivariable_norm.pdf: \"输入矩阵必须是对称正半定矩阵。\"
【发布时间】:2022-10-21 08:28:50
【问题描述】:

所以我在下面有以下代码。

L = np.array([1,2,3])
M = np.array([1,2,3])
Q = np.random.uniform(0,10,size=(3,3))
S = Q.T*Q
print(sp.stats.multivariate_normal.pdf(L,M,S))

显然S 是一个对称的半正定矩阵。我可以用线性代数理论证明它。但是,scipy 抱怨说在运行上述代码时不是这样。我能做些什么来解决这个问题?

【问题讨论】:

  • 您是否使用* 运算符作为矩阵乘法?这是元素明智的乘法。
  • 通常,当我使用 * 运算符时,它会被 python 解释为矩阵乘法。
  • 它不会(除非您使用类matrix,但现在不推荐)。使用@ 运算符进行矩阵乘法。对于传统的 numpy 数组,* 运算符始终执行元素乘法。
  • 我懂了。我猜当矩阵的维度相同时,它会被解释为元素乘法。谢谢!
  • “我猜当矩阵的维度相同时……”决定这一点的不是维度的数量。它是对象类型你正在使用的。 NumPy 有ndarray 对象(这是np.array(...) 创建的),* 是元素乘法,matrix 对象,* 是矩阵乘法。请注意,matrix 对象正在经历(缓慢但稳定)的弃用。

标签: python numpy scipy linear-algebra scipy.stats


【解决方案1】:

就像 Mechanic Pig 的 comment 所说,用 @ 替换 *(Numpy 数组上的元素乘法)。

import scipy as sp
import numpy as np

L = np.array([1, 2, 3])
M = np.array([1, 2, 3])
Q = np.random.uniform(0, 10, size=(3, 3))
S = Q.T @ Q
print(sp.stats.multivariate_normal.pdf(L, M, S))

打印,就我而言,0.0003568248543110567

您可以通过比较来验证您的“协方差”是正定的

  • np.linalg.eig(Q.T * Q)[0],使用逐元素乘法(可能有负值),vs
  • np.linalg.eig(Q.T @ Q)[0](不会有负值)。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2018-02-18
    • 2016-11-05
    • 2017-04-03
    • 2013-03-08
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2021-02-17
    相关资源
    最近更新 更多