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

What would be valid starting conditions to pass to 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 的问题。

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


首先是您在 Octave 的统计数据包 v1.4.2 中遇到了一个 已知错误 ,即将发布的版本 reported here, and has been 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 很有用。

很高兴为您服务;如果您想借此机会参与 Octave / 开源社区并自己贡献错误报告,我同样感到高兴1。让我知道:)


1.如果你这样做,你介意在此处对错误报告评论 link 以供参考:)