2014-07-18 11 views
2

我正在嘗試使用gm進行羣集。我想這樣的代碼:gmdistribution.fit問題

opts = statset('MaxIter', 300, 'Display', 'iter'); 

gm = gmdistribution.fit(braindata, nsegments, 'Regularize', 1e-6, 'Options', opts); 

其中braindata是數據矩陣(體素*蛋白,1478071 * 11)和nsegments值是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); 

是有沒有解決這個問題的方法?

+0

你真的只有一個錯誤;第二個'Error'行是調用堆棧的一部分,告訴你在'reducedSegbrain_gmix'中發現了對'gmdistribution.fit'的失敗調用。 – xenoclast

回答

1

對我來說,最好的選擇是放棄該列。在我的申請中沒問題,但可能不適合你。

這裏的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 

其中X是傳遞給fit方法的多變量數據。其對「有效零差異」的測試是eps的組合,它是當前數據類型(例如uint8double)表示的最小差異的度量以及數據中的行數。

所以一種方法是在gmdistribution.fit引發錯誤之前重新執行該測試並對其執行某些操作。如果數據的變化很小以至於它被認爲是零,那麼從它的包含中就沒有任何可以獲得的數據,因此丟棄該列並繼續與剩下的數據進行擬合併沒有什麼壞處。

從你的例子看起來就是你數據集的一半。這可能並不理想,但在多變量分析中發現變量的一個子集包含大部分方差(cf Pareto)並不罕見。儘管上面的測試已經有效地完成了,但您可以首先進行主成分分析以放棄一些適合之前的測試。

如果您絕對必須包含這些列,那麼您可以對其進行一些其他處理以提高方差。首先,我會確保這些值被存儲在一個具有足夠的精度來表示它們的數據類型中,儘管這通常是由MATLAB自動完成的。

如果這些低方差列的平均值與其他列的數量級不同(注意上述測試是相對於所有列方差的最大值的eps),那麼這將導致以相對的差距,你可能會減少一些明智的正常化。

如果這一切都失敗了,那麼也許你必須回到採集源並提高信噪比。如果這是一臺核磁共振成像機,那麼我祝你好運...