import numpy as np
from sklearn.mixture import GaussianMixture, BayesianGaussianMixture
import matplotlib.pyplot as plt
from math import sin, cos, pi

npts = 100

while True:
    sigmas = 1 + np.random.rand(3)*5

    d1 = np.random.randn(npts,2) * sigmas[0]
    d1[:,0] += 10
    d1[:,1] += 5

    d2 = np.random.randn(npts,2) * sigmas[2]
    d2[:,0] += 25
    d2[:,1] += 35

    d3 = np.random.randn(npts,2) * sigmas[1]
    d3[:,0] += 30
    d3[:,1] += -5

    data = np.concatenate((d1,d2,d3))

    plt.plot(data[:,0],data[:,1],'.')

    gmm = GaussianMixture(n_components=3)
    #gmm = BayesianGaussianMixture(n_components=7)
    gmm.fit(data)

    means = gmm.means_
    covariances = gmm.covariances_

    circle = np.array([[cos(x*pi/20), sin(x*pi/20)] for x in range(41)])
    for i in range(len(means)):
        plt.plot(circle[:,0]*2*covariances[i,0,0]**0.5+means[i,0],
                 circle[:,1]*2*covariances[i,1,1]**0.5+means[i,1], 'y')

    plt.show()
