def __init__(self,sim, final_momentum=0.9, initial_momentum=0.5,momentum_switchover=5,lr_s=1e-6, lr_nu=1e-2 , lr_Yslack=1e-2, maxIter=1000,initS=0.0,initSviaLineSearch=True): self.initSviaLineSearch=initSviaLineSearch self.sim=sim self.initYslack=0 self.n=self.sim.N*2 self.theta=self.sim.theta/(self.sim.L/self.sim.winSize); self.initC0 = np.ones(self.sim.numReplicates,dtype=floatX)*logit(sim.X0.min()) self.Times=np.tile(sim.getGenerationTimes(),(self.sim.numReplicates,1)).T.astype(np.float32) self.momentum_ = T.scalar() self.final_momentum=final_momentum; self.initial_momentum=initial_momentum;self.momentum_switchover=momentum_switchover;self.W=3;self.lr_s=lr_s;self.lr_theta=lr_Yslack;self.lr_nu=lr_nu;self.maxIter=maxIter;self.initS=initS self.lrS_ = T.scalar();self.lrNu_ = T.scalar();self.lrTheta_ = T.scalar();self.target_ = T.matrix(); self.times_ = T.fmatrix("times"); self.theta_ = T.scalar() self.Yslack__=theano.shared(np.asarray(0, dtype = floatX), 'theta');self.n_ = T.scalar("n ") self.S__=theano.shared(np.asarray(self.initS, dtype = floatX)) self.c__=theano.shared(self.initC0, 'c') self.weightUpdateS__ = theano.shared(np.asarray(0, dtype = floatX)) self.weightUpdatec__ = theano.shared(np.zeros(self.sim.numReplicates, dtype = floatX)) self.weightUpdateYslack__ = theano.shared(np.asarray(0, dtype = floatX)) self.pred_= Z(sig_(0.5*self.S__*self.times_ + self.c__),self.n_,self.theta_) + self.Yslack__ self.Feedforward_ = theano.function(inputs=[self.times_,self.n_,self.theta_], outputs=self.pred_) self.cost_=0 for j in range(self.sim.numReplicates): self.cost_ += 0.5*((self.target_[:,j] - self.pred_[:,j])**2).sum() self.Loss_ = theano.function(inputs=[self.target_,self.pred_], outputs=self.cost_) self.gS_,self.gc_, self.gYslack_ = T.grad(self.cost_, [self.S__,self.c__, self.Yslack__]) self.updatesS=[(self.weightUpdateS__, self.momentum_ * self.weightUpdateS__ - self.lrS_ * self.gS_),(self.S__, self.S__ + self.momentum_ * self.weightUpdateS__ - self.lrS_ * self.gS_)] self.updatesc=[(self.weightUpdatec__, self.momentum_ * self.weightUpdatec__ - self.lrNu_ * self.gc_),(self.c__, self.c__ + self.momentum_ * self.weightUpdatec__ - self.lrNu_ * self.gc_)] self.updatesYslack=[(self.weightUpdateYslack__, self.momentum_ * self.weightUpdateYslack__ - self.lrTheta_ * self.gYslack_),(self.Yslack__, self.Yslack__ + self.momentum_ * self.weightUpdateYslack__ - self.lrTheta_ * self.gYslack_)] self.updates= self.updatesc +self.updatesS + self.updatesYslack self.Objective_ = theano.function([ self.target_, self.lrS_, self.lrNu_, self.lrTheta_, self.times_,self.momentum_,self.n_,self.theta_], self.cost_, on_unused_input='warn',updates=self.updates,allow_input_downcast=True)
def setSIM(self, sim): if sim is not None: self.sim=sim self.numReplicates=self.sim.numReplicates self.n=self.sim.N*2 self.initTheta=self.sim.theta/(self.sim.L/self.sim.winSize); self.initC0 = np.ones(self.numReplicates,dtype=floatX)*logit(sim.X[0].mean(1).min()) self.Times=np.tile(sim.getGenerationTimes(),(self.numReplicates,1)).T.astype(np.float32) self.replicateIndex=range(self.numReplicates) else: self.initC0 = np.ones(self.numReplicates,dtype=floatX) try: self.reset() except: pass
def fit(self,y=None,pos=1,verbose=0): timesIDX=y.abs().sum(1)!=0 self.y= y[timesIDX] self.times= self.Times[np.where(timesIDX.values)[0]] obj0=self.getZeroObj() if self.initSviaLineSearch: self.setInitYslackViaLineSearch() self.setInitSviaLineSearch() self.reset() start_time=time.time() for i in range(self.maxIter): obj=self.Objective_(self.y,self.lr_s, self.lr_nu, self.lr_theta, self.times, (self.final_momentum , self.initial_momentum)[i<5],self.n, self.theta) if verbose>1: print obj ,self.S__.get_value(), self.Yslack__.get_value(),sig(self.c__.get_value()) if verbose: print obj ,self.S__.get_value(), self.Yslack__.get_value(),sig(self.c__.get_value()) negLogLikelihoodRatio=np.log(obj0)-np.log(self.Loss_(self.y,self.Feedforward_(self.times,self.n,self.theta))) s=np.asscalar(self.S__.get_value()) if s<1e-6: negLogLikelihoodRatio=0 s=0 self.sol=pd.Series({'s':s,'LR':negLogLikelihoodRatio,'Time':time.time()-start_time,'pos':pos,'nu0':sig(self.c__.get_value()),'slack':np.asscalar(self.Yslack__.get_value()),'obj':float(obj), 'obj0':float(obj0), 'times': self.times, 'y':self.y, 'theta':self.theta, 'n':self.n, 'smoothTimes': np.tile(np.arange(self.times[0][0] , self.times[-1][0]+1),(self.sim.numReplicates,1)).T}) return self.sol