Matlab gm.fit的问题
我正在尝试使用gm进行群集。我尝试了以下代码:Matlab gm.fit的问题,matlab,cluster-analysis,gaussian,Matlab,Cluster Analysis,Gaussian,我正在尝试使用gm进行群集。我尝试了以下代码: opts = statset('MaxIter', 300, 'Display', 'iter'); gm = gmdistribution.fit(braindata, nsegments, 'Regularize', 1e-6, 'Options', opts); 其中braindata是一个数据矩阵(体素*蛋白质,1478071*11),N片段是8 我得到了这个错误: Error using gmdistribution.fit (lin
opts = statset('MaxIter', 300, 'Display', 'iter');
gm = gmdistribution.fit(braindata, nsegments, 'Regularize', 1e-6, 'Options', opts);
其中braindata是一个数据矩阵(体素*蛋白质,1478071*11),N片段是8
我得到了这个错误:
Error using gmdistribution.fit (line 136) The following column(s) of data are effectively constant: 6 7 8 9 10 11.
Error in reducedSegbrain_gmix (line 119) gm = gmdistribution.fit(braindata, nsegments, 'Regularize', 1e-6, 'Options', opts);
对此有什么解决办法吗?对我来说,最好的选择是放弃该列。这在我的申请中是可以的,但可能不适合你 下面是
gmdistribution
类定义的位,用于检查该条件并产生错误:
varX = var(X);
I = find(varX < eps(max(varX))*n);
if ~isempty(I)
error('stats:gmdistribution:ZeroVariance',...
'The following column(s) of data are effectively constant: %s.', num2str(I));
end
varX=var(X);
I=查找(varX
其中X
是传递给fit
方法的多变量数据。它的“有效零方差”测试是eps
的组合,它是当前数据类型(如uint8
或double
)和数据行数可表示的最小差异的度量
因此,一种方法是重新实现该测试,并在gmdistribution.fit
抛出错误之前对其进行处理。如果数据的方差很低,被认为是零,那么从中没有什么好处,因此丢弃该列并继续与剩下的列进行拟合也没有坏处
从示例的外观来看,这将是数据集的一半。这可能并不理想,但在多元分析中,发现变量子集包含大部分方差(cf Pareto)的情况并不少见。您可以先进行主成分分析,以丢弃gmm拟合之前的一些主成分分析,尽管上面的测试已经有效地做到了这一点
如果您必须包含这些列,那么您可以对它们进行其他处理以提高方差。首先,我要确保这些值存储在一个数据类型中,该数据类型具有足够的精度来表示它们,尽管这通常由MATLAB自动处理得相当好
如果这些低方差列的平均值与其他列有足够数量级的差异(注意,上述测试是相对于所有列的最大方差的eps
),那么这将产生相对差异,您可以通过一些明智的归一化来减少相对差异
如果所有这些都失败了,那么你可能必须回到采集源,提高信噪比。如果那是一台MRI机器,那么我祝你好运……你只有一个错误;第二行
Error
是调用堆栈的一部分,它告诉您在reducedSegbrain\u gmix
中的何处找到了对gmdistribution.fit的失败调用。