梯度下降算法

    在学习逻辑回归时,对梯度上升算法进行了应用,看到其他的博客讲解,梯度上升算法适合求最大值,梯度下降算法适合求最小值,这里有一个分析:

梯度上升算法公式

                                                    

是学习率,是一个常数。

                                                       


这个是根据逻辑回归的损失函数进行推导的。

梯度下降公式:

                                                   

                        


这个是根据线性回归的损失函数推导的。

我在思考这个跟线性回归里边的平方误差一样,都是求导为什么计算的结果不一样,后来才明白,线性回归用的是最小二乘法,梯度下降用的是损失函数,也不知道这样理解对不对。

随机梯度算法:

def stochastic_gradient_descent(x,y,theta,alpha,m,max_iter): # 自变量,因变量,待求的权值,学习速度,样本总数,最大迭代次数
    #随机梯度下降法,每一次梯度下降只使用一个样本
    iter=0
    flag=0
    while True:
        for i in range(m):#遍历样本
            deviation=0
            h=theta[0]*x[i][0] +theta[1]*x[i][1]
            theta[0] =theta[0] + alpha*(y[i]-h)*x[i][0]
            theta[1] =theta[1] + alpha*(y[i]-h)*x[i][1]
            iter = iter+1
            #计算误差
            for i in range(m):
                deviation = deviation +(y[i]-(theta[0]*x[i][0]+theta[1]*x[i][1]))**2
            if deviation <EPS or iter>max_iter:
                flag=1
                break
        if flag==1:.
            break
    return theta,iter,deviation
matrix_x = [[2.1,1.5],[2.5,2.3],[3.3,3.9],[3.9,5.1],[2.7,2.7]]
matrix_y = [2.5,3.9,6.7,8.8,4.6]
MAX_ITER =5000
EPS = 0.0001
theta=[2,-1]
ALPHA = 0.05
resultTheta,iters,deviation=stochastic_gradient_descent(matrix_x,matrix_y,theta,ALPHA,5,MAX_ITER)
print ('theta=',resultTheta)
print ('iters=',iters)
print ('deviation=',deviation)

批量梯度下降算法:

def batch_gradient_descent(x,y,theta,alpha,m,max_iter):
    #批量梯度下降法,每一次梯度下降使用训练集中的所有样本来计算误差。

    deviation = 1
    iter = 0
    while deviation > EPS and iter < max_iter:
        deviation = 0
        sigma1 = 0
        sigma2 = 0
        for i in range(m): #对训练集中的所有数据求和迭代
            h = theta[0] * x[i][0] + theta[1] * x[i][1]
            sigma1 = sigma1 +  (y[i] - h)*x[i][0] 
            sigma2 = sigma2 +  (y[i] - h)*x[i][1] 
        theta[0] = theta[0] + alpha * sigma1 /m
        theta[1] = theta[1] + alpha * sigma2 /m
        #计算误差
        for i in range(m):
            deviation = deviation + (y[i] - (theta[0] * x[i][0] + theta[1] * x[i][1])) ** 2
        iter = iter + 1
    return theta, iter
matrix_x = [[2.1,1.5],[2.5,2.3],[3.3,3.9],[3.9,5.1],[2.7,2.7]]
matrix_y = [2.5,3.9,6.7,8.8,4.6]
MAX_ITER = 5000
EPS = 0.0001 

#批量梯度
theta = [2,-1]
ALPHA = 0.05

resultTheta,iters = batch_gradient_descent(matrix_x, matrix_y, theta, ALPHA, 5, MAX_ITER)
print ('theta=',resultTheta)
print ('iters=',iters)

随机梯度是在运行中选中一个样本,适合样本多的例子,但是,结果可能准确性不高。

批量梯度是选择m个样本就是比较,找到最小值,该算法适合样本少的例子,运行的效果也是比较好的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱缘之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值