Separate Drawing of Gaussian Mixture Model

21 visualizzazioni (ultimi 30 giorni)
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 Commenti
Ji Hoon Jeong
Ji Hoon Jeong il 24 Ago 2018
Modificato: Ji Hoon Jeong il 24 Ago 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 il 28 Ago 2018
Thanks a lot, this helped a lot!

Accedi per commentare.

Risposta accettata

Tom Lane
Tom Lane il 28 Gen 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.

Più risposte (2)

yusra Ch
yusra Ch il 5 Set 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 Commento
Ji Hoon Jeong
Ji Hoon Jeong il 18 Set 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))...
);

Accedi per commentare.


cynthia thing
cynthia thing il 31 Dic 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