【问题标题】:MATLABs fitgmdist function in 1 dimensionMATLAB fitgmdist 一维函数
【发布时间】:2019-05-15 11:36:32
【问题描述】:

我之前曾在Mathworks Community 上发布过此内容,但我在此转发给更广泛的受众...

我有一个一维直方图,我想拟合高斯:

在上面的示例中,我需要找到 4 个主峰的中心,但是,在不同的直方图中,峰的数量可能会有所不同。 以下是我的方法的 MWE:

bins = 2000;
fsc_hist = histogram(FSC_data.FSC_HF,bins);hold on;
%% smooth data to get rid of discretization
fscValues = fsc_hist.Values;
binStep = (fsc_hist.BinLimits(2)-fsc_hist.BinLimits(1))/fsc_hist.NumBins;
binCenters =  binStep * [0:fsc_hist.NumBins-1];
smoothValues = smooth(binCenters, fscValues, 0.1, 'rloess');
%% fit GMM
expectedPeaks = 4;
gmm = fitgmdist(smoothValues, expectedPeaks, 'RegularizationValue', 0.1);

返回以下 GMM 结果:

一维 4 个分量的高斯混合分布

组分1:混合比例:0.294734 均值:0.2417

组分2:混合比例:0.152275 均值:41.9369

组分3:混合比例:0.344658 均值:6.8231

组分4:混合比例:0.208333 均值:24.6758

显然,计算的高斯平均值是不正确的。 我的方法哪里出了问题?我相信要么我对fitgmdist 函数的第一个输入必须以某种方式进行标准化,要么我需要对输出进行后处理。到目前为止,我的尝试都失败了。

【问题讨论】:

  • 如果你使用histcounts而不是histogram,那么它会为你输出bin边缘(第二个输出),让生活更轻松!

标签: matlab curve-fitting gaussian


【解决方案1】:

正在发生的事情是混合模型为您提供了计数的高斯分布均值。您应该将原始 FSC_data.FSC_HF 数据输入到第一个参数中,而不是将直方图输入到 fitgmdist 中。

【讨论】:

  • 感谢您的回答!原始 FSC_HF 数据是大小为 1x28497 的向量(即 = 每个 bin 的计数总和)。我不明白这有什么意义,因为这个向量没有结构......它只是一个“随机”的数字序列。将 GMM 拟合到此将导致无意义。不管怎样,我已经尝试了你的建议:没有任何运气。我不能说我完全理解 fitgmdist 期望作为第一个输入的内容......在我看来,我需要同时提供 bin 中心(作为 x 向量)以及 bin 计数(作为 y 向量) fitgmdist 然后可以拟合曲线...
  • Matlab 程序使用期望最大化算法 (EM) 处理数据,该算法可能不需要将直方图计数作为输入。另一种可能达到您的目标的类似结果的方法是对分布进行阈值化(可能一次将其拆分为两个,然后再拆分一个以返回 4 个分布)。然后,您可以找到四种分布中每一种的均值。
猜你喜欢
  • 1970-01-01
  • 2016-04-14
  • 2012-08-24
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
相关资源
最近更新 更多