Exemple #1
0
    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, '')
Exemple #2
0
    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, '')
Exemple #3
0
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
Exemple #4
0
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