def testMultiplePointMultipleComponent(self): for i in range(100): x = array([[uniform(-4, 4), uniform(-4, 4)]] * 2) mu = array([[uniform(-4, 4), uniform(-4, 4)]] * 2) a = uniform(0, 4) b = uniform(0, 4) pi = array([1] * 2) sigma = array([eye(2) + a, eye(2) + b]) # x = array([[1,0],[1,1]]) # mu = array([[1,1],[1,1]]) # sigma = array([eye(2)]*2) presult = array([[float(pmvnormpdf(x[0, :], mu[0, :], sigma[0, :, :])), float(pmvnormpdf(x[0, :], mu[1, :], sigma[1, :, :]))], [ float(pmvnormpdf(x[1, :], mu[0, :], sigma[0, :, :])), float(pmvnormpdf(x[1, :], mu[1, :], sigma[1, :, :]))]]) cresult = compmixnormpdf(x, pi, mu, sigma) # print result, compmixnormpdf(x,pi,mu,sigma) # print mixnormpdf(x,pi,mu,sigma), sum(result,1) self.assertAlmostEqual(presult[0, 0], cresult[0, 0], 6, 'pmvnormpdf and mvnormpdf differ in result, %f != %f, (%d): %s, %s, %s ' % ( presult[0, 0], cresult[0, 0], i, str(x[0, :]), str(mu[0]), str(sigma[0]).replace('\n', ','))) self.assertAlmostEqual(presult[1, 0], cresult[1, 0], 6, 'pmvnormpdf and mvnormpdf differ in result, %f != %f, (%d): %s, %s, %s ' % ( presult[1, 0], cresult[1, 0], i, str(x[0, :]), str(mu[1]), str(sigma[1]).replace('\n', ','))) self.assertAlmostEqual(presult[0, 0], cresult[0, 0], 6, 'pmvnormpdf and mvnormpdf differ in result, %f != %f, (%d): %s, %s, %s ' % ( presult[0, 1], cresult[0, 1], i, str(x[0, :]), str(mu[0]), str(sigma[0]).replace('\n', ','))) self.assertAlmostEqual(presult[1, 0], cresult[1, 0], 6, 'pmvnormpdf and mvnormpdf differ in result, %f != %f, (%d): %s, %s, %s ' % ( presult[1, 1], cresult[1, 0], i, str(x[0, :]), str(mu[1]), str(sigma[1]).replace('\n', ','))) self.assertAlmostEqual(sum(presult, 1)[0], mixnormpdf( x, pi, mu, sigma)[0], 6, '') # what are these two checking? self.assertAlmostEqual( sum(presult, 1)[1], mixnormpdf(x, pi, mu, sigma)[1], 6, '')
def testMultiplePointMultipleComponent(self): for i in range(100): x = array([[uniform(-4, 4), uniform(-4, 4)]] * 2) mu = array([[uniform(-4, 4), uniform(-4, 4)]] * 2) a = uniform(0, 4) b = uniform(0, 4) pi = array([1] * 2) sigma = array([eye(2) + a, eye(2) + b]) # x = array([[1,0],[1,1]]) # mu = array([[1,1],[1,1]]) # sigma = array([eye(2)]*2) presult = array( [[ float(pmvnormpdf(x[0, :], mu[0, :], sigma[0, :, :])), float(pmvnormpdf(x[0, :], mu[1, :], sigma[1, :, :])) ], [ float(pmvnormpdf(x[1, :], mu[0, :], sigma[0, :, :])), float(pmvnormpdf(x[1, :], mu[1, :], sigma[1, :, :])) ]]) cresult = compmixnormpdf(x, pi, mu, sigma) # print result, compmixnormpdf(x,pi,mu,sigma) # print mixnormpdf(x,pi,mu,sigma), sum(result,1) self.assertAlmostEqual( presult[0, 0], cresult[0, 0], 6, 'pmvnormpdf and mvnormpdf differ in result, %f != %f, (%d): %s, %s, %s ' % (presult[0, 0], cresult[0, 0], i, str(x[0, :]), str( mu[0]), str(sigma[0]).replace('\n', ','))) self.assertAlmostEqual( presult[1, 0], cresult[1, 0], 6, 'pmvnormpdf and mvnormpdf differ in result, %f != %f, (%d): %s, %s, %s ' % (presult[1, 0], cresult[1, 0], i, str(x[0, :]), str( mu[1]), str(sigma[1]).replace('\n', ','))) self.assertAlmostEqual( presult[0, 0], cresult[0, 0], 6, 'pmvnormpdf and mvnormpdf differ in result, %f != %f, (%d): %s, %s, %s ' % (presult[0, 1], cresult[0, 1], i, str(x[0, :]), str( mu[0]), str(sigma[0]).replace('\n', ','))) self.assertAlmostEqual( presult[1, 0], cresult[1, 0], 6, 'pmvnormpdf and mvnormpdf differ in result, %f != %f, (%d): %s, %s, %s ' % (presult[1, 1], cresult[1, 0], i, str(x[0, :]), str( mu[1]), str(sigma[1]).replace('\n', ','))) self.assertAlmostEqual( sum(presult, 1)[0], mixnormpdf(x, pi, mu, sigma)[0], 6, '') # what are these two checking? self.assertAlmostEqual( sum(presult, 1)[1], mixnormpdf(x, pi, mu, sigma)[1], 6, '')
def _mode_search(pi, mu, sigma, nk=0, tol=0.000001, maxiter=20): """Search for modes in mixture of Gaussians""" k, unused_p = mu.shape omega = np.copy(sigma) a = np.copy(mu) for j in range(k): omega[j] = inv(sigma[j]) a[j] = solve(sigma[j], mu[j]) if nk > 0: allx = np.concatenate([mu, mixnormrnd(pi, mu, sigma, nk)]) else: allx = np.copy(mu) allpx = mixnormpdf(allx, pi, mu, sigma, use_gpu=False) nk += k mdict = {} # modes sm = [] # starting point of mode search spm = [] # density at starting points etol = np.exp(tol) # rnd = int(-1*np.floor(np.log10(tol))) rnd = 1 for js in range(nk): x = allx[js] px = allpx[js] sm.append(x) spm.append(px) # w = compmixnormpdf(allx,pi,mu,sigma) h = 0 eps = 1 + etol while ((h <= maxiter) and (eps > etol)): w = compmixnormpdf(x, pi, mu, sigma, use_gpu=False) Y = np.sum([w[j] * omega[j] for j in range(k)], 0) yy = np.dot(w, a) y = solve(Y, yy) py = mixnormpdf(y, pi, mu, sigma, use_gpu=False) eps = py / px x = y px = py h += 1 mdict[(js, tuple(x))] = [x, px] # eliminate duplicates return mdict, sm, spm