无法使用 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)
比较d
和d_fit
,我发现匹配非常好,并且随着样本数量的增加而变得更好。
总而言之:您可能只需要更多(独特的)样本来适应。
【讨论】:
以上是关于无法使用 Distributions.jl 拟合 MvNormal 分布。错误:PosDefException:矩阵不是正定的; Cholesky 分解失败的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark ml 无法拟合模型并且总是“AttributeError:'PipelinedRDD' 对象没有属性'_jdf'