Separate Drawing of Gaussian Mixture Model

25 vues (au cours des 30 derniers jours)
Ji Hoon Jeong
Ji Hoon Jeong le 27 Jan 2016
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 commentaires
Ji Hoon Jeong
Ji Hoon Jeong le 24 Août 2018
Modifié(e) : Ji Hoon Jeong le 24 Août 2018
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 le 28 Août 2018
Thanks a lot, this helped a lot!

Connectez-vous pour commenter.

Réponse acceptée

Tom Lane
Tom Lane le 28 Jan 2016
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 commentaire
Amr Hashem
Amr Hashem le 10 Avr 2017
What is equivalent to "Makedist" as I am using Matlab 2012?

Connectez-vous pour commenter.

Plus de réponses (2)

yusra Ch
yusra Ch le 5 Sep 2020
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 commentaire
Ji Hoon Jeong
Ji Hoon Jeong le 18 Sep 2020
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))...
);

Connectez-vous pour commenter.


cynthia thing
cynthia thing le 31 Déc 2020
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