Matlab gm.fit的问题

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

我正在尝试使用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 (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的失败调用。