吴恩达机器学习课程(一)之梯度下降原理

来源:互联网 发布:淘宝api 编辑:程序博客网 时间:2024/06/08 19:20

梯度下降法

对于线性回归分析,我们将假设函数定义为h(x)=θ0+θ1x1++θnxn
x0=1x=(x0x1xn),θ=θ0θ1θn
因为假设函数与参数θ有关,记hθ(x)=h(x)=xθ
对于每一个训练样本X(i)=(xi0,xi1,,xin),假设函数与样本输出值存在误差hθ(Xi)yi,J(θ)=12ni=1(hθ(Xi)yi)2
目标函数定义为minθJ(θ)=12ni=1(hθ(Xi)yi)2

梯度下降的迭代算法

梯度下降法的原理是每次沿着梯度的方向去更新参数,更新公式为θi=θiαJ(θ)θi
其中J(θ)θi=mi=1(hθ(Xi)yi)(hθ(Xi)yi)θi
对于样本数量m=1情况,(hθ(Xi)yi)θi=(θ0+θ1x1++θnxnyi)θi=xi
所以参数θi=θiα(hθ(Xi)yi)xi
所以当样本数量大于1的情况,梯度下降过程为:
θi=θiαmj=1hθ(Xj)yj)xji
由于每个参数的求解都需要整个样本数据集的迭代,称为批量随机梯度下降法,收敛速度慢
为了加快训练速度,采用随机梯度下降法,这种方法是通过随机选取一组样本进行参数迭代,训练速度较快,但是会存在噪声,使得参数迭代不是向着整体最优方向,此时可以采用小批量随机梯度下降,这种方法的是选取小批量样本进行参数的迭代,三种方法的python代码如下:

x = [[1,4],[2,5],[5,1],[4,2]]y= [19,26,19,20]theta = [1,1] #参数初始值alpha = 0.1#学习率max_iter = 10000 #最大迭代次数iter_count = 0   #当前迭代次数loss = 10        #当前误差eps = 0.0001 #精度err1 = [0,0,0,0] err2 = [0,0,0,0]while loss>eps and iter_count<max_iter:    loss = 0    err1sum = 0    err2sum = 0    for j in range(4):        predict_y = x[j][0]*theta[0]+x[j][1]*theta[1]        err1[j] = (predict_y-y[j])*x[j][0]        err1sum += err1[j]        err2[j] = (predict_y-y[j])*x[j][1]        err2sum += err2[j]    theta[0] = theta[0]-alpha*err1sum/4 #损失函数一般要做平均    theta[1] = theta[1]-alpha*err2sum/4    for j in range(4):        predict_y = x[j][0]*theta[0]+x[j][1]*theta[1]        loss += (1/(2*4))*(predict_y-y[j])**2    iter_count += 1print(theta)###随机梯度下降SGDimport randomx = [[1,4],[2,5],[5,1],[4,2]]y= [19,26,19,20]theta = [1,1] #参数初始值alpha = 0.01#学习率max_iter = 10000 #最大迭代次数iter_count = 0   #当前迭代次数loss = 10        #当前误差eps = 0.0001 #精度error = 0while loss>eps and iter_count<max_iter:    loss = 0    i = random.randint(0,3)#随机抽取一组样本    predict_y = x[i][0]*theta[0]+x[i][1]*theta[1]    theta[0] = theta[0]-alpha*(predict_y-y[i])*x[i][0]#损失函数一般要做平均    theta[1] = theta[1]-alpha*(predict_y-y[i])*x[i][1]    for i in range(4):        predict_y = x[i][0]*theta[0]+x[i][1]*theta[1]        error = 0.5*(predict_y-y[i])**2        loss += error    iter_count += 1print(theta)###小批量随机梯度下降MBGDimport randomx = [[1,4],[2,5],[5,1],[4,2]]y= [19,26,19,20]theta = [1,1] #参数初始值alpha = 0.01#学习率max_iter = 10000 #最大迭代次数iter_count = 0   #当前迭代次数loss = 10        #当前误差eps = 0.0001 #精度error = 0while loss>eps and iter_count<max_iter:    loss = 0    #这里随机选取2组样本更新theta    i = random.randint(0,3)#随机抽取一组样本    j = (i+1)%4    predict_y0 = x[i][0]*theta[0]+x[i][1]*theta[1]    predict_y1 = x[j][0]*theta[0]+x[j][1]*theta[1]    theta[0] = theta[0]-alpha*1/2*((predict_y0-y[i])*x[i][0]+(predict_y1-y[i])*x[j][0])#损失函数一般要做平均    theta[1] = theta[1]-alpha*1/2*((predict_y0-y[i])*x[i][1]+(predict_y1-y[i])*x[j][1])    for i in range(4):        predict_y = x[i][0]*theta[0]+x[i][1]*theta[1]        error = 0.5/2*(predict_y-y[i])**2        loss += error    iter_count += 1print(theta)

梯度下降的矩阵算法

定义梯度θJ=Jθ0Jθ1Jθn
以下说明几个公式,不懂的可以去看线性代数的知识
trA=ni=1AiitrA=trATtrAB=trBA,trABC=trCAB=trBCA,trABATC=CAB+CTABT,tra=a(aR)
对于整个数据集X=X1X2Xm,Xi=(xi0xi1xin)
j假设函数h=Xθ=X1θX2θXmθ=hθ(X1)hθ(X2)hθ(Xm)
Xθy=hθ(X1)y1hθ(X2)y2hθ(Xm)ym,所以损失函数计算公式为
J(θ)=12XθyT(Xθy)=12mi=1(hθ(Xi)yi)2
θJ(θ)=12θtr(XθyT(Xθy)=12θtr(θTXTXθθTXTyyTXθ+yTy)
θtr(θTXTXθ)=θtr(θIθTXTX)=XTXθI+XTXθIT=2XTXθ
θtr(yTXθ)=XTy,θtr(θTXTy)=θtr(yTXθ)=XTy,θtr(yTy)=0
所以θJ(θ)=12(2XTXθ2XTy)=XTXθXTy
当梯度等于0时,有θ=(XTX)1XTy,这就是梯度下降的矩阵算法

阅读全文
0 0
原创粉丝点击