问题描述
我正在尝试使用 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。如果您这样做,您是否介意在此处评论错误报告的链接以供参考:)