传递给 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 以供参考:)
我正在尝试使用 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 以供参考:)