45 lines
1.1 KiB
Python
45 lines
1.1 KiB
Python
"""
|
|
=================================
|
|
Gaussian Mixture Model Ellipsoids
|
|
=================================
|
|
|
|
Plot the confidence ellipsoids of a mixture of two gaussians.
|
|
"""
|
|
|
|
import numpy as np
|
|
from scikits.learn import mixture
|
|
import itertools
|
|
|
|
import pylab as pl
|
|
import matplotlib as mpl
|
|
|
|
n, m = 300, 2
|
|
|
|
# generate random sample, two components
|
|
np.random.seed(0)
|
|
C = np.array([[0., -0.7], [3.5, .7]])
|
|
X = np.r_[np.dot(np.random.randn(n, 2), C),
|
|
np.random.randn(n, 2) + np.array([3, 3])]
|
|
|
|
clf = mixture.GMM(n_states=2, cvtype='full')
|
|
clf.fit(X)
|
|
|
|
splot = pl.subplot(111, aspect='equal')
|
|
color_iter = itertools.cycle (['r', 'g', 'b', 'c'])
|
|
|
|
Y_ = clf.predict(X)
|
|
|
|
for i, (mean, covar, color) in enumerate(zip(clf.means, clf.covars, color_iter)):
|
|
v, w = np.linalg.eigh(covar)
|
|
u = w[0] / np.linalg.norm(w[0])
|
|
pl.scatter(X[Y_==i, 0], X[Y_==i, 1], .8, color=color)
|
|
angle = np.arctan(u[1]/u[0])
|
|
angle = 180 * angle / np.pi # convert to degrees
|
|
ell = mpl.patches.Ellipse (mean, v[0], v[1], 180 + angle, color=color)
|
|
ell.set_clip_box(splot.bbox)
|
|
ell.set_alpha(0.5)
|
|
splot.add_artist(ell)
|
|
|
|
pl.show()
|
|
|