This is k-means algorithm. It is said to be a variant of EM algorithm so it shouldn't be that different from it. How to change this code so it will become EM algorithm?
x1 = s[0] # vector x
x2 = s[1] # vector y
# Cluster centres
mua0 = [random.uniform(0,2500) for i in range(2)]
mub0 = [random.uniform(0,2500) for i in range(2)]
mua=mua0
mub=mub0
iter = 200
#the algorithm
for j in range(iter):
a = []
b = []
for i in range(len(x1)):
dax = (x1[i] - mua[0])**2 + (x2[i] - mua[1])**2
dbx = (x1[i] - mub[0])**2 + (x2[i] - mub[1])**2
if dax < dbx:
a.append(1)
b.append(0)
else:
b.append(1)
a.append(0)
mua = [sum([x1[i] for i in range(len(x1)) if a[i] == 1])/sum(a), sum([x2[i] for i in range(len(x2)) if a[i] == 1])/sum(a)]
mub = [sum([x1[i] for i in range(len(x1)) if b[i] == 1])/sum(b), sum([x2[i] for i in range(len(x2)) if b[i] == 1])/sum(b)]
# plot
xa1 = [x1[i] for i in range(len(x1)) if a[i] == 1]
xa2 = [x2[i] for i in range(len(x2)) if a[i] == 1]
xb1 = [x1[i] for i in range(len(x1)) if b[i] == 1]
xb2 = [x2[i] for i in range(len(x2)) if b[i] == 1]
for xx, yy in zip(xa1, xa2):
plt.plot([mua[0], xx], [mua[1], yy], 'r')
for xx, yy in zip(xb1, xb2):
plt.plot([mub[0], xx], [mub[1], yy], 'g')