基于python中theano库的线性回归
theano库是做deeplearning重要的一部分,其最吸引人的地方之一是你给出符号化的公式之后,能自动生成导数。本文使用梯度下降的方法,进行数据拟合,现在把代码贴在下方
代码块
importnumpyasnp importtheano.tensorasT importtheano importtime classLinear_Reg(object): def__init__(self,x): self.a=theano.shared(value=np.zeros((1,),dtype=theano.config.floatX),name='a') self.b=theano.shared(value=np.zeros((1,), dtype=theano.config.floatX),name='b') self.result=self.a*x+self.b self.params=[self.a,self.b] defmsl(self,y): returnT.mean((y-self.result)**2) defregrun(rate,data,labels): X=theano.shared(np.asarray(data, dtype=theano.config.floatX),borrow=True) Y=theano.shared(np.asarray(labels, dtype=theano.config.floatX),borrow=True) index=T.lscalar()#定义符号化的公式 x=T.dscalar('x')#定义符号化的公式 y=T.dscalar('y')#定义符号化的公式 reg=Linear_Reg(x=x) cost=reg.msl(y) a_g=T.grad(cost=cost,wrt=reg.a)#计算梯度 b_g=T.grad(cost=cost,wrt=reg.b)#计算梯度 updates=[(reg.a,reg.a-rate*a_g),(reg.b,reg.b-rate*b_g)]#更新参数 train_model=theano.function(inputs=[index],outputs=reg.msl(y),updates=updates,givens={x:X[index],y:Y[index]}) done=True err=0.0 count=0 last=0.0 start_time=time.clock() whiledone: #err_s=[train_model(i)foriinxrange(data.shape[0])] foriinxxx: err_s=[train_model(i)] err=np.mean(err_s) #printerr count=count+1 ifcount>10000orerr<0.1: done=False last=err end_time=time.clock() print'Totaltimeis:',end_time-start_time,'s'#5.12s print'lasterror:',err print'avalue:',reg.a.get_value()#[2.92394467] print'bvalue:',reg.b.get_value()#[1.81334458] if__name__=='__main__': rate=0.01 data=np.linspace(1,10,10) labels=data*3+np.ones(data.shape[0],dtype=np.float64)+np.random.rand(data.shape[0]) regrun(rate,data,labels)
其基本思想是随机梯度下降。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。