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

梯度下降法

对于线性回归分析,我们将假设函数定义为 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_count0
    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 += 1
print(theta)


###随机梯度下降SGD
import random
x = [[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 = 0

while loss>eps and iter_count0
    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 += 1
print(theta)

###小批量随机梯度下降MBGD
import random
x = [[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 = 0

while loss>eps and iter_count0
    #这里随机选取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 += 1
print(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 ,这就是梯度下降的矩阵算法

你可能感兴趣的:(机器学习)