def optimize(self,params0): """ initialize """ self.gp.setParams(params0) self.cache['params0'] = params0 self.cache['lml0'] = self.gp.LML() self.cache['lmlGrad0'] = self.gp.LMLgrad() """ optimize """ gpopt = limix.CGPopt(self.gp) conv = gpopt.opt() """ store stuff """ self.cache['lml'] = self.gp.LML() self.cache['lmlGrad'] = self.gp.LMLgrad() self.cache['params'] = self.gp.getParams() self.cache['X'] = self.Ca.getParams().reshape((self.N,self.k),order='F') self.cache['K'] = self.Ca.K() if self.interaction: self.cache['Ki'] = self.Ca.K()*self.Cb2.K() else: self.cache['Ki'] = None self.cache['var'] = {} self.cache['var']['K0'] = self.C0.getParams()[0]**2 self.cache['var']['K'] = self.cache['K'].diagonal().mean() if self.interaction: self.cache['var']['Ki'] = self.cache['Ki'].diagonal().mean() self.cache['var']['noise'] = self.ll.getParams()[0]**2 self.cache['K'] /= self.cache['var']['K'] if self.interaction: self.cache['Ki'] /= self.cache['var']['Ki'] return conv
def fit(self, Params0=None, grad_threshold=1e-2): """ fit a variance component model with the predefined design and the initialization and returns all the results """ # GPVD initialization lik = limix.CLikNormalNULL() # Initial Params if Params0 == None: n_params = self.C1.getNumberParams() n_params += self.C2.getNumberParams() Params0 = SP.rand(n_params) # MultiGP Framework covar = [] gp = [] mean = [] for i in range(self.N): covar.append(limix.CLinCombCF()) covar[i].addCovariance(self.C1) covar[i].addCovariance(self.C2) coeff = SP.array([self.eigen[i], 1]) covar[i].setCoeff(coeff) mean.append(limix.CLinearMean(self.Yt[:, i], SP.eye(self.P))) gpVD = limix.CGPvarDecomp(covar[0], lik, mean[0], SP.ones(self.N), self.P, self.Yt, Params0) for i in range(self.N): gp.append(limix.CGPbase(covar[i], lik, mean[i])) gp[i].setY(self.Yt[:, i]) gpVD.addGP(gp[i]) # Optimization gpVD.initGPs() gpopt = limix.CGPopt(gpVD) LML0 = -1.0 * gpVD.LML() start_time = time.time() conv = gpopt.opt() time_train = time.time() - start_time LML = -1.0 * gpVD.LML() LMLgrad = SP.linalg.norm(gpVD.LMLgrad()['covar']) Params = gpVD.getParams()['covar'] # Check whether limix::CVarianceDecomposition.train() has converged if conv != True or LMLgrad > grad_threshold or Params.max() > 10: print 'limix::CVarianceDecomposition::train has not converged' res = None else: res = { 'Params0': Params0, 'Params': Params, 'LML': SP.array([LML]), 'LML0': SP.array([LML0]), 'LMLgrad': SP.array([LMLgrad]), 'time_train': SP.array([time_train]), } return res pass
def test_fit(self): #create optimization object self.gpopt = limix.CGPopt(self.gp) #run RV = self.gpopt.opt() RV = self.gpopt.opt() RV = RV & (SP.absolute(self.gp.LMLgrad()['X']).max() < 1E-1) RV = RV & (SP.absolute(self.gp.LMLgrad()['covar']).max() < 1E-1) RV = RV & (SP.absolute(self.gp.LMLgrad()['lik']).max() < 1E-1) self.assertTrue(RV)
def test_fit(self): #create optimization object self.gpopt = limix.CGPopt(self.gp) self.gpopt.setOptBoundLower(self.constrainL) self.gpopt.setOptBoundUpper(self.constrainU) #run self.gpopt.opt() params = SP.concatenate( (self.gp.getParams()['covar'], self.gp.getParams()['lik']))[:, 0] params_true = SP.array( [0.28822188, 0.35271548, 0.13709146, 0.49447424]) RV = ((params - params_true)**2).max() < 1e-6 RV = RV & (SP.absolute(self.gp.LMLgrad()['lik']).max() < 1E-4) RV = RV & (SP.absolute(self.gp.LMLgrad()['covar']).max() < 1E-4) self.assertTrue(RV)
GP['covar'].addCovariance(GP['covar_E']) #liklihood: gaussian GP['ll'] = limix.CLikNormalIso() GP['data'] = limix.CData() GP['hyperparams'] = limix.CGPHyperParams() #Create GP instance GP['gp'] = limix.CGPbase(GP['data'], GP['covar'], GP['ll']) #set data GP['gp'].setY(Y) #input: effectively we require the group for each sample (CCovFreeform requires this) Xtrain = SP.zeros([Y.shape[0], 1]) Xtrain[N::1] = 1 GP['gp'].setX(Xtrain) gpopt = limix.CGPopt(GP['gp']) #constraints: make sure that noise level does not go completel crazy constrainU = limix.CGPHyperParams() constrainL = limix.CGPHyperParams() constrainU['lik'] = +5 * SP.ones([1]) constrainL['lik'] = -5 * SP.ones([1]) gpopt.setOptBoundLower(constrainL) gpopt.setOptBoundUpper(constrainU) #filters: we do not need to optimize the overall scaling prameter in front of Kpop P = [] L = [] #use a number of restarts... #TODO: think about a more elegant scheme to handle multiple restarts properly t0 = time.time() for i in xrange(1):
def train(self,rank=20,Kpop=True,LinearARD=False): """train panama module""" if 0: covar = limix.CCovLinearISO(rank) ll = limix.CLikNormalIso() X0 = sp.random.randn(self.N,rank) X0 = PCA(self.Y,rank)[0] X0 /= sp.sqrt(rank) covar_params = sp.array([1.0]) lik_params = sp.array([1.0]) hyperparams = limix.CGPHyperParams() hyperparams['covar'] = covar_params hyperparams['lik'] = lik_params hyperparams['X'] = X0 constrainU = limix.CGPHyperParams() constrainL = limix.CGPHyperParams() constrainU['covar'] = +5*sp.ones_like(covar_params); constrainL['covar'] = 0*sp.ones_like(covar_params); constrainU['lik'] = +5*sp.ones_like(lik_params); constrainL['lik'] = 0*sp.ones_like(lik_params); if 1: covar = limix.CSumCF() if LinearARD: covar_1 = limix.CCovLinearARD(rank) covar_params = [] for d in range(rank): covar_params.append(1/sp.sqrt(d+2)) else: covar_1 = limix.CCovLinearISO(rank) covar_params = [1.0] covar.addCovariance(covar_1) if self.use_Kpop: covar_2 = limix.CFixedCF(self.Kpop) covar.addCovariance(covar_2) covar_params.append(1.0) ll = limix.CLikNormalIso() X0 = PCA(self.Y,rank)[0] X0 /= sp.sqrt(rank) covar_params = sp.array(covar_params) lik_params = sp.array([1.0]) hyperparams = limix.CGPHyperParams() hyperparams['covar'] = covar_params hyperparams['lik'] = lik_params hyperparams['X'] = X0 constrainU = limix.CGPHyperParams() constrainL = limix.CGPHyperParams() constrainU['covar'] = +5*sp.ones_like(covar_params); constrainL['covar'] = -5*sp.ones_like(covar_params); constrainU['lik'] = +5*sp.ones_like(lik_params); gp=limix.CGPbase(covar,ll) gp.setY(self.Y) gp.setX(X0) lml0 = gp.LML(hyperparams) dlml0 = gp.LMLgrad(hyperparams) gpopt = limix.CGPopt(gp) gpopt.setOptBoundLower(constrainL); gpopt.setOptBoundUpper(constrainU); t1 = time.time() gpopt.opt() t2 = time.time() #Kpanama self.Xpanama = covar_1.getX() if LinearARD: self.Xpanama /= self.Xpanama.std(0) self.Kpanama = covar_1.K() self.Kpanama/= self.Kpanama.diagonal().mean() # Ktot self.Ktot = covar_1.K() if self.use_Kpop: self.Ktot += covar_2.K() self.Ktot/= self.Ktot.diagonal().mean() #store variances V = {} if LinearARD: V['LinearARD'] = covar_1.getParams()**2*covar_1.getX().var(0) else: V['Kpanama'] = sp.array([covar_1.K().diagonal().mean()]) if self.use_Kpop: V['Kpop'] = sp.array([covar_2.K().diagonal().mean()]) V['noise'] = gp.getParams()['lik']**2 self.varianceComps = V
covar_r = limix.CFixedCF(SP.eye(N)) Xr = SP.zeros([N, 0]) Xc = SP.zeros([D, 0]) gp = limix.CGPkronecker(covar_r, covar_c) gp.setX_r(Xr) gp.setX_c(Xc) gp.setY(Y) params = limix.CGPHyperParams() params["covar_r"] = SP.zeros([covar_r.getNumberParams()]) params["covar_c"] = SP.zeros([covar_c.getNumberParams()]) params["lik"] = SP.log([0.1, 0.1]) gp.setParams(params) opt = limix.CGPopt(gp) opt.opt() #opt.gradCheck() if 0: opt_params = limix.CGPHyperParams() opt_params["lik"] = params["lik"] gp.setParams(opt_params) pdb.set_trace() #lmm object lmm = limix.CGPLMM(gp) lmm.setSNPs(S) lmm.setCovs(SP.ones([N, 1])) lmm.setPheno(Y)
# initalization params = limix.CGPHyperParams() params['covarc1'] = SP.randn(covarc1.getNumberParams()) params['covarc2'] = SP.randn(covarc2.getNumberParams()) params['covarr1'] = SP.ones(1) params['covarr2'] = SP.ones(1) params['dataTerm'] = SP.randn(P + 1, 1) gpKS.setParams(params) # Paramask paramMask = limix.CGPHyperParams() paramMask['covarc1'] = covarc1.getParamMask() paramMask['covarc2'] = covarc2.getParamMask() paramMask['covarr1'] = covarr1.getParamMask() paramMask['covarr2'] = covarr2.getParamMask() # optimisation gpKSopt = limix.CGPopt(gpKS) start_time = time.time() gpKSopt.opt() elapsed_timeFast = time.time() - start_time print "time elapsed(s): " + str(elapsed_timeFast) paramsOpt = gpKS.getParams() print "" print "optimised parameters" print SP.concatenate((paramsOpt['covarc1'], paramsOpt['covarr1'], paramsOpt['covarc2'], paramsOpt['covarr2'])) print paramsOpt['dataTerm'] print "" print "GP BASE" # NormalGP