无法使用 Distributions.jl 拟合 MvNormal 分布错误:PosDefException:矩阵不是正定的; Cholesky 分解失败

问题描述

我正在尝试将 Mvnormal 分布拟合到光谱数据矩阵,但出现以下错误

distributions.fit(Mvnormal,myMatrix)

> ERROR: PosDefException: matrix is not positive definite; Cholesky factorization Failed.

myMatrix 由许多连续波数(行)的吸光度读数(每项一列)组成。它不是方阵,因此它不能是正定的。

从我在网上看到的情况来看,很多人报告了在 Julia 的 Cholesky 分解步骤中各种方法失败的错误消息。我知道这是因为它在检查是否满足 PD 标准方面比其他语言更严格。

其他人(例如,请参阅 this post)通过在说明分布时对 sigma 参数进行细微更改来设法解决此问题。但是,由于我不是根据参数创建分布,而是将其拟合到矩阵,因此我不确定该怎么做。

我非常感谢任何关于

的建议
  • 我如何尝试使我的矩阵适合 Cholesky 分解,或者
  • 使用任何其他方法或包将多元正态分布拟合到我的数据中。

解决方法

在撰写本文时,我认为此错误消息具有高度误导性,或者可能是一个错误。

fit 不期望 myMatrix 是正定的,实际上它甚至不应该是方阵。

fit 期望第二个参数是 n by S 矩阵,其中 n 是维数,S 是样本数你适合反对。 有关正定矩阵和正定问题的错误消息仅来自它在拟合欠定系统期间执行的数学运算。在正常情况下,我们希望 S 远大于 n

示例:

# Construct samples:
C = [0.2 0; 0.1 0.3]
mean = [2.,3.]
d = MvNormal(mean,C)
samples = rand(d,100) # This is your input data,in this case a 2x100 matrix.

# Fitting:
d_fit = Distributions.fit(MvNormal,samples)

比较 dd_fit,我看到了非常好的匹配,而且随着样本数量的增加,它变得更好。

总而言之:您可能只需要更多(独特的)样本来适应。