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

Posted

技术标签:

【中文标题】无法使用 Distributions.jl 拟合 MvNormal 分布。错误:PosDefException:矩阵不是正定的; Cholesky 分解失败【英文标题】:Cannot fit a MvNormal distribution with Distributions.jl. ERROR: PosDefException: matrix is not positive definite; Cholesky factorization failed 【发布时间】:2021-09-01 16:10:08 【问题描述】:

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

Distributions.fit(MvNormal, myMatrix)

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

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

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

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

我将非常感谢任何关于

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

【问题讨论】:

【参考方案1】:

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

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,我发现匹配非常好,并且随着样本数量的增加而变得更好。

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

【讨论】:

以上是关于无法使用 Distributions.jl 拟合 MvNormal 分布。错误:PosDefException:矩阵不是正定的; Cholesky 分解失败的主要内容,如果未能解决你的问题,请参考以下文章

Scipy曲线拟合无法将数据准确拟合到傅里叶级数

Pyspark ml 无法拟合模型并且总是“AttributeError:'PipelinedRDD' 对象没有属性'_jdf'

Tensorflow 对象检测 API 中的过拟合

我无法将逻辑回归拟合到模型中。如何解决这个问题?

Python:使用 MLPRegressor 拟合 3D 函数

使用 MLPRegressor 拟合简单数据时遇到问题