基于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)
其基本思想是随机梯度下降。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。