def solve_with_moments(m1, M2, M3, K): """ Whiten and unwhiten appropriately """ assert symmetric_skew(M2) < 1e-2 assert symmetric_skew(M3) < 1e-2 W, Wt = get_whitener( M2, K ) M3_ = sc.einsum( 'ijk,ia,jb,kc->abc', M3, W, W, W ) #print "M3", M3 pi_, M_, _, _ = candecomp(M3_, K) #print "mu", M_ mu = Wt.dot(M_.dot(diag(pi_))) return mu
def solve_mixture_model(model, data): """ Whiten and unwhiten appropriately """ d = model["d"] # Get moments moments = model.empirical_moments(data, model.observed_monomials(3)) M2 = zeros((d, d)) M3 = zeros((d, d, d)) for i in xrange(d): for j in xrange(d): xij = sp.sympify('x%d * x%d' %(i+1, j+1)) M2[i,j] = moments[xij] for k in xrange(d): xijk = sp.sympify('x%d * x%d * x%d' % (i+1, j+1, k+1)) M3[i,j,k] = moments[xijk] k = model["k"] # Symmetrize M2, M3 = symmetrize(M2), symmetrize(M3) assert symmetric_skew(M2) < 1e-2 assert symmetric_skew(M3) < 1e-2 # Whiten W, Wt = get_whitener(M2, k) M3_ = einsum('ijk,ia,jb,kc->abc', M3, W, W, W) pi_, M_, _, _ = candecomp(M3_, k) # Unwhiten M M_ = Wt.dot(M_.dot(diag(pi_))) pi_ = 1./pi_**2 # "Project" onto simplex pi_ = make_distribution(abs(pi_)) M_ = array([make_distribution(col) for col in M_.T]).T return pi_, M_
def solve_mixture_model(model, data): """ Whiten and unwhiten appropriately """ d = model["d"] # Get moments moments = model.empirical_moments(data, model.observed_monomials(3)) M2 = zeros((d, d)) M3 = zeros((d, d, d)) for i in xrange(d): for j in xrange(d): xij = sp.sympify('x%d * x%d' % (i + 1, j + 1)) M2[i, j] = moments[xij] for k in xrange(d): xijk = sp.sympify('x%d * x%d * x%d' % (i + 1, j + 1, k + 1)) M3[i, j, k] = moments[xijk] k = model["k"] # Symmetrize M2, M3 = symmetrize(M2), symmetrize(M3) assert symmetric_skew(M2) < 1e-2 assert symmetric_skew(M3) < 1e-2 # Whiten W, Wt = get_whitener(M2, k) M3_ = einsum('ijk,ia,jb,kc->abc', M3, W, W, W) pi_, M_, _, _ = candecomp(M3_, k) # Unwhiten M M_ = Wt.dot(M_.dot(diag(pi_))) pi_ = 1. / pi_**2 # "Project" onto simplex pi_ = make_distribution(abs(pi_)) M_ = array([make_distribution(col) for col in M_.T]).T return pi_, M_
def prerequisites( T, K ): """ Does the tensor satisfy the prerequisites? (a) tensor should be symmetric (orthogonal) """ if len(T.shape) != 3: return False elif not is_square(T): return False elif T.shape[0] < K: return False elif symmetric_skew(T) > 1e-1: return False else: return True
def prerequisites(T, K): """ Does the tensor satisfy the prerequisites? (a) tensor should be symmetric (orthogonal) """ if len(T.shape) != 3: return False elif not is_square(T): return False elif T.shape[0] < K: return False elif symmetric_skew(T) > 1e-1: return False else: return True