add pca_joint initialization for ssmrd

This commit is contained in:
Zhenwen Dai 2014-10-22 17:38:41 +01:00
parent c7ea906763
commit fd0f0f2902

View file

@ -38,7 +38,7 @@ class SSMRD(Model):
self.models[0].X.mean.tie_vector(*[m.X.mean for m in self.models[1:]]) self.models[0].X.mean.tie_vector(*[m.X.mean for m in self.models[1:]])
self.models[0].X.variance.tie_vector(*[m.X.variance for m in self.models[1:]]) self.models[0].X.variance.tie_vector(*[m.X.variance for m in self.models[1:]])
self.models[0].kern.tie_vector(*[m.kern for m in self.models[1:]]) # self.models[0].kern.tie_vector(*[m.kern for m in self.models[1:]])
def parameters_changed(self): def parameters_changed(self):
varp_list = [m.X for m in self.models] varp_list = [m.X for m in self.models]
@ -51,6 +51,7 @@ class SSMRD(Model):
def _init_X(self, Ylist, input_dim, X=None, X_variance=None, Gammas=None, initx='PCA_concat'): def _init_X(self, Ylist, input_dim, X=None, X_variance=None, Gammas=None, initx='PCA_concat'):
# Divide latent dimensions # Divide latent dimensions
idx = np.empty((input_dim,),dtype=np.int) idx = np.empty((input_dim,),dtype=np.int)
residue = (input_dim)%(len(Ylist)) residue = (input_dim)%(len(Ylist))
@ -63,18 +64,24 @@ class SSMRD(Model):
idx[i*size+residue:(i+1)*size+residue] = i idx[i*size+residue:(i+1)*size+residue] = i
if X is None: if X is None:
X = np.empty((Ylist[0].shape[0],input_dim)) if initx == 'PCA_concat':
fracs = np.empty((input_dim,)) X = np.empty((Ylist[0].shape[0],input_dim))
from ..util.initialization import initialize_latent fracs = np.empty((input_dim,))
for i in xrange(len(Ylist)): from ..util.initialization import initialize_latent
Y = Ylist[i] for i in xrange(len(Ylist)):
dim = (idx==i).sum() Y = Ylist[i]
if dim>0: dim = (idx==i).sum()
x, fr = initialize_latent('PCA', dim, Y) if dim>0:
X[:,idx==i] = x x, fr = initialize_latent('PCA', dim, Y)
fracs[idx==i] = fr X[:,idx==i] = x
fracs[idx==i] = fr
elif initx=='PCA_joint':
y = np.hstack(Ylist)
from ..util.initialization import initialize_latent
X, fracs = initialize_latent('PCA', input_dim, y)
else: else:
fracs = np.ones(input_dim) fracs = np.ones(input_dim)
if X_variance is None: # The variance of the variational approximation (S) if X_variance is None: # The variance of the variational approximation (S)
X_variance = np.random.uniform(0,.1,X.shape) X_variance = np.random.uniform(0,.1,X.shape)