def barycenter_alpha(means, kerns, T, xi): """ The barycenter function used for optimization""" def sig(x): return 1 / (1 + np.exp(-1 * x)) n = kerns[0].shape[0] for i in range(len(kerns)): kerns[i] = np.reshape(kerns[i], (n, n)) # Calculate the barycenter mean # mm = lambda dist: np.mean(dist, x) # mbar = sum([sig(xi)*means[i] for i in range(len(means))]) # just two dists for now # mbar = sig(xi)*means[0] + (1-sig(xi))*means[1] mbar = 0 # Calculate the barycenter covariance matrix` # Kbar = np.matmul(np.random.rand(means[1].shape[0], means[1].shape[0]), np.random.rand(means[1].shape[0], means[1].shape[0])) # Kbar = sum([xi[i] * kerns[i] for i in range(len(kerns))]) # Initialize Kbar to be the euclidean average Kbar = sig(xi) * kerns[0] + (1-sig(xi)) * kerns[1] # Initialize Kbar to be the euclidean average # print("KBAR:", Kbar) update = lambda kern, Kbar2, x_i: x_i * ss.sqrtm(np.matmul(np.matmul(Kbar2, kern), Kbar2)) for t in range(1, T): Kbar2 = ss.sqrtm(Kbar) Kbarnew = update(kerns[0], Kbar2, sig(xi)) + update(kerns[1], Kbar2, (1-sig(xi))) # print("t, NAN IN SQRT, diff: ", t, np.isnan(Kbar2).any(), np.mean(np.abs(Kbarnew - Kbar))) Kbar = Kbarnew return mbar, Kbar
def sample(var_param, n_samples, seed=None): my_rs = rs if seed is None else npr.RandomState(seed) s = np.sqrt(my_rs.chisquare(df, n_samples) / df) param_dict = ms_pattern.fold(var_param) z = my_rs.randn(n_samples, dim) sqrtSigma = sqrtm(param_dict['Sigma']) return param_dict['mu'] + np.dot(z, sqrtSigma)/s[:,np.newaxis]
def fun(A): return to_scalar(spla.sqrtm(A))