def eA(tau_a0,tau_a1,K): exp_ln_a = zeros((K,K)) acc = digamma(tau_a0) - digamma(tau_a0 + tau_a1) for i in range(K): for j in range(K): exp_ln_a[i,j] = digamma(tau_a1[i,j]) - digamma(tau_a0[i,j] + tau_a1[i,j]) + acc[i,:j].sum() return exp_ln_a
def eA(tau_a0,tau_a1,K): exp_ln_a = np.zeros((K,K)) acc = digamma(tau_a0) - digamma(tau_a0 + tau_a1) for i in range(K): for j in range(K): exp_ln_a[i,j] = digamma(tau_a1[i,j]) - digamma(tau_a0[i,j] + tau_a1[i,j]) + acc[i,:j].sum() return exp_ln_a
def m(self,X,exp_z): #given expected value of z, calculate the variational parameters of each component (w.r.t. this sensor) alpha_c = self._hyperparams['c'] #assumes symmetric prior (though this is v. easy to change to non-symmetric prior) tau_ctk = alpha_c + dot(X.T, exp_z) self._tau_ctk = tau_ctk self._exp_ctk = tau_ctk / tau_ctk.sum(axis=0) self._exp_ln_ctk = digamma(tau_ctk) - digamma(tau_ctk.sum(axis=0))
def m(self, X, exp_z): #given expected value of z, calculate the variational parameters of each component (w.r.t. this sensor) alpha_c = self._hyperparams[ 'c'] #assumes symmetric prior (though this is v. easy to change to non-symmetric prior) tau_ctk = alpha_c + dot(X.T, exp_z) self._tau_ctk = tau_ctk self._exp_ctk = tau_ctk / tau_ctk.sum(axis=0) self._exp_ln_ctk = digamma(tau_ctk) - digamma(tau_ctk.sum(axis=0))
def log_lambda(vk, dim, K, w): log = np.zeros((K,)) for k in range(K): (_, log[k]) = slogdet(w[k, :, :]) log[k] += np.sum([digamma((vk[k]+1-i)/2.0) for i in range(dim)]) log += dim*np.log(2.0) return log #[K,1]
def Invcopt(W,vk,XDim,K): invc = [None for _ in range(K)] for k in range(K): dW = det(W[k]) print 'dW',dW if dW>1e-30: ld = log(dW) else: ld = 0.0 invc[k] = sum([digamma((vk[k]+1-i) / 2.) for i in range(XDim)]) + XDim*log(2) + ld return invc
def _eInvc(self,W,vk,XDim,K): invc = [None for _ in range(K)] for k in range(K): dW = np.linalg.det(W[k]) #print 'dW',dW if dW>1e-30: ld = np.log(dW) else: ld = 0.0 invc[k] = sum([digamma((vk[k]+1-i) / 2.) for i in range(XDim)]) + XDim*np.log(2) + ld return np.array(invc)
def Piopt(alpha0,NK): alphak = alpha0 + NK pik = digamma(alphak) - digamma(alphak.sum()) return pik
def ePi(tau_pi0,tau_pi1,K): exp_ln_pi = np.zeros(K) acc = digamma(tau_pi0) - digamma(tau_pi0 + tau_pi1) for k in range(K): exp_ln_pi[k] = digamma(tau_pi1[k]) - digamma(tau_pi0[k] + tau_pi1[k]) + acc[:k].sum() return exp_ln_pi
def log_pi(alphak): return digamma(alphak) - digamma(alphak.sum()) #[K,]
def ePi(tau_pi0,tau_pi1,K): exp_ln_pi = zeros(K) acc = digamma(tau_pi0) - digamma(tau_pi0 + tau_pi1) for k in range(K): exp_ln_pi[k] = digamma(tau_pi1[k]) - digamma(tau_pi0[k] + tau_pi1[k]) + acc[:k].sum() return exp_ln_pi