def gmmEM(data, K, it,show=False,usekmeans=True): #data += finfo(float128).eps*100 centroid = kmeans2(data, K)[0] if usekmeans else ((max(data) - min(data))*random_sample((K,data.shape[1])) + min(data)) N = data.shape[0] gmm = GaussianMM(centroid) if show: gmm.draw(data) while it > 0: print it," iterations remaining" it = it - 1 # e-step gausses = zeros((K, N), dtype = data.dtype) for k in range(0, K): gausses[k] = gmm.c[k]*mulnormpdf(data, gmm.mean[k], gmm.covm[k]) sums = sum(gausses, axis=0) if count_nonzero(sums) != sums.size: raise "Divide by Zero" gausses /= sums # m step sg = sum(gausses, axis=1) if count_nonzero(sg) != sg.size: raise "Divide by Zero" gmm.c = ones(sg.shape) / N * sg for k in range(0, K): gmm.mean[k] = sum(data * gausses[k].reshape((-1,1)), axis=0) / sg[k] d = data - gmm.mean[k] d1 = d.transpose()*gausses[k] gmm.covm[k]=dot(d1,d)/sg[k] if show: gmm.draw(data) return gmm
def getP(self,sample): p = zeros(sample.shape[0]) for k in range(0,self.N): p += self.c[k]*mulnormpdf(sample, self.mean[k], self.covm[k]) return p.reshape((-1,1))