传递给 fitgmdist 的有效起始条件是什么?

问题描述

我正在尝试使用 Octave 统计包中的 fitgmdist 函数。当我让它使用认的 k++ 方法来查找初始参数时,它就起作用了。然而,结果并不一致,有时只是平面错误。这就是为什么我希望能够根据直方图传递均值的初始值。但出于某种原因,该函数不会接受它们。我一直在结束的错误如下:

error: fitgmdist: invalid start parameter
error: called from
    fitgmdist at line 202 column 9
    curve_fitting at line 78 column 17

curve_fitting 只是我的脚本名称。 我正在尝试为该函数使用以下代码

nbOrientations = 2;
initial_orientations = [38.0; 18.0]; % #values here should match nbOrientations
initial_weights = ones(1,nbOrientations)/nbOrientations;
initial_Sigma = ones(1,1,nbOrientations);
start = struct('mu',initial_orientations,'Sigma',initial_Sigma,'ComponentProportion',initial_weights)
GMModel_Theta = fitgmdist(Angle_Theta,nbOrientations,'Start',start,'RegularizationValue',0.0001)

我的数据只是一个 700ish x 1 的数组。

我检查了我的结构,在我看来它满足我在 matlab/octave 文档中可以找到的要求。我完全不知道如何解决这个问题。希望有人能指出我正确的方向。

编辑: 我设法在其他人的计算机上的 matlab 中测试了我的脚本,并且刚刚成功。在我看来,这是 Octave 的一个问题。

解决方法

为了将来的读者,将评论中的讨论转换为答案。这里有两个问题:


首先是您在八度音程的统计包 v1.4.2 中遇到了已知错误,该错误为 reported here,并且在即将发布的版本中为 fixed (在撰写此答案时,尚未发布)。

如果您想自己应用修复而不是等待下一个版本,请有效地更正第 194 行(从 'ComponentProprition''ComponentProportion')上的错字,并注释掉不必要的签入行 204-206


第二个是您还遇到了一个未报告的错误。我正在将您的代码转换为下面的完整测试用例以演示该问题(我稍微更改了值以匹配我的输入):

pkg load statistics

Angle_Theta          = [ 30 + 10 * randn(1,10),60 + 10 * randn(1,10) ].';
nbOrientations       = 2;
initial_orientations = [38.0; 18.0];   % values here should match nbOrientations
initial_weights      = ones( 1,nbOrientations ) / nbOrientations;
initial_Sigma        = 10 * ones( 1,1,nbOrientations );

start = struct( 'mu',initial_orientations,'Sigma',initial_Sigma,'ComponentProportion',initial_weights        )

GMModel_Theta = fitgmdist( Angle_Theta,nbOrientations,'Start',start,'RegularizationValue',0.0001   )

197,尝试确保没有不匹配的维度。不幸的是,这样做似乎忽略了 Sigma 可能无法共享,因此当 sigma 包含超过 2 个维度时(即当第 3 个维度表示组件数量时),检查失败。

我修改了代码,将 size(Sigma) 更改为 size(Sigma,1),即有效地仅针对 Sigma 进行检查,假设(天真地) Sigma 的剩余尺寸很好。这使检查能够通过(同时仍然是一个有用的检查),并且代码现在按预期运行,给出以下输出:

Gaussian mixture distribution with 2 components in 1 dimension(s)
Clust 1: weight 0.450954
        Mean: 60.839
        Variance:45.190
Clust 2: weight 0.549046
        Mean: 32.3048
        Variance:98.217
AIC=174.207 BIC=179.186 NLogL=82.1037 Iter=84 Cged=1 Reg=0.0001

既然您帮助发现了另一个错误,report it to the octave bug tracker 对您很有帮助。

我很高兴代表您这样做;如果您想借此机会与八度音阶/开源社区互动并自己贡献错误报告,我同样很高兴1。让我知道:)


1。如果您这样做,您是否介意在此处评论错误报告的链接以供参考:)