In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
%load_ext autoreload
%autoreload 2
In [2]:
from numpy.random import rand, randn
In [3]:
n, d, k = 100, 2, 2
In [11]:
np.random.seed(20)
X = rand(n, d)
# means = [rand(d) for _ in range(k)] # works for any k
means = [rand(d) * 0.5 + 0.5 , - rand(d) * 0.5 + 0.5] # for better plotting when k = 2
S = np.diag(rand(d))
sigmas = [S]*k # we'll use the same Sigma for all clusters for better visual results
print(means)
print(sigmas)
print(2**np.pi)
np.linalg.det(np.eye(3))
Out[11]:
In [44]:
def compute_log_p(X, mean, sigma):
dxm = X - mean
exponent = -0.5 * np.sum(dxm * np.dot(dxm, np.linalg.inv(sigma)), axis=1)
return exponent - np.log(2 * np.pi) * (d / 2) - 0.5 * np.log(np.linalg.det(sigma))
In [45]:
log_ps = [compute_log_p(X, m, s) for m, s in zip(means, sigmas)] # exercise: try to do this without looping
In [46]:
assignments = np.argmax(log_ps, axis=0)
print(assignments)
In [47]:
colors = np.array(['red', 'green'])[assignments]
plt.scatter(X[:, 0], X[:, 1], c=colors, s=100)
plt.scatter(np.array(means)[:, 0], np.array(means)[:, 1], marker='*', s=200)
plt.show()
In [ ]: