Separate Drawing of Gaussian Mixture Model

12 ビュー (過去 30 日間)
Ji Hoon Jeong
Ji Hoon Jeong 2016 年 1 月 27 日
回答済み: cynthia thing 2020 年 12 月 31 日
I have a 1D data which need to be separated by two .
So I used
fitgmdist(data,2);
and got
  1. mu
  2. sigma
  3. component proportion
for each of the gaussian distribution.
And here is the graph. (Gray : Data, Blue : psd of GMModel from fitgmdist)
Until here, everything was okay.
So, question.
How can I separate those two gaussian distribution graph?
I tried
  1. Using makedist('Normal') to create each gaussian distribution.
  2. Multiply by each component proportion
  3. Add two distribution up
But somehow I wasn't able to get the same graph overlapping picture above.
Probably I have the wrong concept of "Normalization" or "Gaussian Mixture Model".
Any advise or site to lookup would be grateful.
------------------------------------------------------------ @Image Analyst: data uploaded. thanks for the advice I'll remember that next time :)
  5 件のコメント
Ji Hoon Jeong
Ji Hoon Jeong 2018 年 8 月 24 日
編集済み: Ji Hoon Jeong 2018 年 8 月 24 日
For your information, I just uploaded the same kind of my data file to this question. The uploaded '.mat' file has 3 variables,
  • rawdata
  • tabulated (tabulated = tabulate(round(data*10))
  • GMModel (GMModel = fitgmdist(data,2))
The code I used to draw upper graph is below
tabulated = tabulate(round(drawdata));
bar(tabulated(:,1),tabulated(:,3)/100,'FaceColor','k');
hold on;
GMModel = fitgmdist(drawdata(:,1),2);
plot(tabulated(:,1),pdf(GMModel,tabulated(:,1)),'Color','r','LineWidth',1);
I hope this helps you.
Trisha Kibaya
Trisha Kibaya 2018 年 8 月 28 日
Thanks a lot, this helped a lot!

サインインしてコメントする。

採用された回答

Tom Lane
Tom Lane 2016 年 1 月 28 日
You did something like this:
x = [randn(4000,1)/2; 5+2*randn(6000,1)];
f = fitgmdist(x,2);
histogram(x,'Normalization','pdf')
xgrid = linspace(-4,12,1001)';
hold on; plot(xgrid,pdf(f,xgrid),'r-'); hold off
You can duplicate the pdf values by doing something like this:
n1 = makedist('normal',f.mu(1),sqrt(f.Sigma(1)));
n2 = makedist('normal',f.mu(2),sqrt(f.Sigma(2)));
p = f.ComponentProportion;
y = p(1)*pdf(n1,xgrid) + p(2)*pdf(n2,xgrid);
hold on; plot(xgrid,y,'c--'); hold off
One thing to watch out for. In probability and statistics, it's common to write the standard deviation of a univariate normal distribution as the Greek letter sigma. But it's common to write the covariance matrix of a multivariate distribution as capital Sigma. So that's why I used sqrt(Sigma) to create the univariate distributions.
  1 件のコメント
Amr Hashem
Amr Hashem 2017 年 4 月 10 日
What is equivalent to "Makedist" as I am using Matlab 2012?

サインインしてコメントする。

その他の回答 (2 件)

yusra Ch
yusra Ch 2020 年 9 月 5 日
Could you plz tell me how did you plot the bleu line in your graph ? I have GM that I want to draw but I dont know how to do it . could you plz help me?
gm =
Gaussian mixture distribution with 2 components in 1 dimensions
Component 1:
Mixing proportion: 0.500000
Mean: 3.3153
Component 2:
Mixing proportion: 0.500000
Mean: -61.5348
The values of Sigma are :
val(:,:,1) =
15.3648
val(:,:,2) =
137.2863
  1 件のコメント
Ji Hoon Jeong
Ji Hoon Jeong 2020 年 9 月 18 日
My code and question were related to how to fit raw data into a Gaussian Mixture Distribution, so it's bit different than your intention.
If you already know about the parameters of your distribution, than use the code below
% X range
xran = -10 : 0.1 : 10;
% Component 1
mu1 = 3.3153;
sigma1 = 15.3648;
proportion1 = 0.5;
% Component 2
mu2 = -61.5348;
sigma2 = 137.2863;
proportion2 = 0.5;
% plot the GMD
plot(xran, ...
proportion1 * pdf('Normal', xran, mu1, sigma1) + proportion2 * pdf('Normal', xran, mu2, sigma2)...
);
if the Sigma value you got is not the std, rather covariance matrix of a multivariate distribution, than uses this instead.
plot(xran, ...
proportion1 * pdf('Normal', xran, mu1, sqrt(sigma1)) + proportion2 * pdf('Normal', xran, mu2, sqrt(sigma2))...
);

サインインしてコメントする。


cynthia thing
cynthia thing 2020 年 12 月 31 日
Hi , could you share the code for the histogram with fitted mixture model curve like the first picture above?
Much appreciated

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by