In [1]:
import time
In [2]:
from random import uniform
import numpy as np
from multivariate_util import *
In [3]:
import copy
In [4]:
from matplotlib.animation import FuncAnimation, ArtistAnimation
import matplotlib.pyplot as plt
In [5]:
size = 300
actual_mu01 = [-4, .4]
actual_cov01 = [[.40, 0], [.7, 1.55]]
actual_df01 = 27
x01 = multivariate_t_rvs(m=actual_mu01, S=actual_cov01, df=actual_df01, n=size)
actual_mu02 = [.9, -.5]
actual_cov02 = [[1.5, 0.7], [0, 0.5]]
actual_df02 = 47
x02 = multivariate_t_rvs(m=actual_mu02, S=actual_cov02, df=actual_df02, n=size)
x01 = np.concatenate([x01, x02])
In [6]:
actual_t01 = multivariate_t(actual_mu01, actual_cov01, actual_df01)
actual_t02 = multivariate_t(actual_mu02, actual_cov02, actual_df02)
In [7]:
xmin, xmax = min(x01.T[0]), max(x01.T[0])
ymin, ymax = min(x01.T[1]), max(x01.T[1])
x, y = np.mgrid[xmin:xmax:.1, ymin:ymax:.1]
xy = np.column_stack([x.ravel(), y.ravel()])
plt.scatter(x01.T[0], x01.T[1])
plt.contour(x, y, np.reshape(actual_t01.pdf(xy), x.shape))
plt.contour(x, y, np.reshape(actual_t02.pdf(xy), x.shape))
plt.show()
In [8]:
t = MultivariateTMixture(2)
In [9]:
t.fit(x01)
In [10]:
start = time.time()
l = []
best = t;
likelihood = t.log_likelihood(x01)
l.append(likelihood)
for j in range(1):
t = MultivariateTMixture(2)
t.fit(x01)
for i in range(60):
t.iterate(x01)
if t.log_likelihood(x01) > likelihood:
best = copy.deepcopy(t)
likelihood = t.log_likelihood(x01)
l.append(t.log_likelihood(x01))
print 'elapsed time %s' % (time.time() - start)
print t.mixes
print t.pi
print 'LIKELIHOOD %.8f' % likelihood
In [11]:
plt.plot(range(len(l)), l)
plt.hlines(best.log_likelihood(x01), 0, 200)
plt.title(best.log_likelihood(x01))
plt.xticks(np.arange(0, len(l), 15))
plt.show()
In [12]:
xmin, xmax = min(x01.T[0]), max(x01.T[0])
ymin, ymax = min(x01.T[1]), max(x01.T[1])
x, y = np.mgrid[xmin:xmax:.1, ymin:ymax:.1]
xy = np.column_stack([x.ravel(), y.ravel()])
z = {}
for idx, mix in enumerate(t.mixes):
z[idx] = mix.pdf(xy)
plt.figure(figsize=(15, 4))
plt.subplot(121)
plt.scatter(x01.T[0], x01.T[1])
for _ in z.values():
plt.contour(x, y, np.reshape(_, x.shape))
z = {}
for idx, mix in enumerate(best.mixes):
z[idx] = mix.pdf(xy)
plt.subplot(122)
plt.scatter(x01.T[0], x01.T[1])
for _ in z.values():
plt.contour(x, y, np.reshape(_, x.shape))
plt.show()
In [39]:
fig = plt.figure()
ax = fig.add_subplot(111)
plt.scatter(x01.T[0], x01.T[1])
ims = []
for i in range(60):
t.iterate(x01)
z = {}
for idx, mix in enumerate(t.mixes):
z[idx] = mix.pdf(xy)
im = ax.contour(x, y, np.reshape(z[0], x.shape))
add_arts1 = im.collections
im = ax.contour(x, y, np.reshape(z[1], x.shape))
add_arts2 = im.collections
an = ax.annotate(i, xy=(0.45, 1.05), xycoords='axes fraction')
ims.append(add_arts1 + add_arts2 + [an])
In [40]:
ani = ArtistAnimation(fig, ims)
ani.save('animation.gif', writer='imagemagick')
plt.show()