2

I want to plot a Gaussian Mixture Model. The following code allows me to plot 2 separate Gaussians, but where they intersect, the line is very sharp and not smooth enough. Is there a way to plot the pdf of a 1D GMM?

def plot_data():
    mu = [-6, 5]
    var = [2, 3]
    sigma = [np.sqrt(var[0]), np.sqrt(var[1])]
    x = np.linspace(-10, 10, 100)
    curve_0 = mlab.normpdf(x, mu[0], sigma[0])
    curve_1 = mlab.normpdf(x, mu[1], sigma[1])
    import ipdb; ipdb.set_trace()
    plt.plot(x, curve_0, color='grey')
    plt.plot(x, curve_1, color='grey')
    plt.fill_between(x,curve_0 , color='grey')
    plt.fill_between(x,curve_1, color='grey')
    plt.show()
    plt.savefig('data_t0.jpg')
RKM
  • 3,151
  • 9
  • 37
  • 50
  • you first may want to find out how the probability density function of a gaussian mixture model looks like :) – cel Feb 20 '17 at 08:56

2 Answers2

2

You can literally draw samples from a Gaussian mixture model and plot the empirical density / histogram too:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
n = 10000 # number of sample to be drawn
mu = [-6, 5]
sigma = [2, 3]
samples = []
for i in range(n): # iteratively draw samples
    Z = np.random.choice([0,1]) # latent variable
    samples.append(np.random.normal(mu[Z], sigma[Z], 1))
sns.distplot(samples, hist=False)
plt.show()
sns.distplot(samples)
plt.show()

enter image description here

Sandipan Dey
  • 21,482
  • 2
  • 51
  • 63
0

You have to form a convex combination of the densities.

curve = p*curve_0 + (1-p)*curve_1

where p is the probability that a sample comes from the first Gaussian.

Paul Panzer
  • 51,835
  • 3
  • 54
  • 99