随机梯度下降算法过程详细解读_python 排序算法

随机梯度下降算法过程详细解读_python 排序算法梯度下降算法梯度下降,依照所给数据,判断函数,随机给一个初值w,之后通过不断更改,一步步接近原函数的方法。更改的过程也就是根据梯度不断修改w的过程。以简单的一元函数为例原始数据为x_data=[1.0,2.0,3.0]y_data=[2.0,4.0,6.0]因此我们设置函数为对于该函数,我们的w是未知的,因此如何根据xy的数据,获取到正确的w值就是梯度下降…


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

梯度下降算法 

梯度下降,依照所给数据,判断函数,随机给一个初值w,之后通过不断更改,一步步接近原函数的方法。更改的过程也就是根据梯度不断修改w的过程。

以简单的一元函数为例

原始数据为

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

因此我们设置函数为

随机梯度下降算法过程详细解读_python 排序算法

对于该函数,我们的w是未知的,因此如何根据xy的数据,获取到正确的w值就是梯度下降的目标。

首先我们要先给定一个随机w值,这个值可以是任何数,我们的算法就会根据我们所计算的cost函数,判断偏离正确数据有多大,之后根据梯度,对w进行更新,直到cost为0,我们也就获取到正确的w值。

cost函数,也就是根据自己的模拟量,算出的结果与原函数所给数据的差值的平方

cost函数的表示为(所求的是N个数据的平均cost)

随机梯度下降算法过程详细解读_python 排序算法

cost函数对w的求导为

随机梯度下降算法过程详细解读_python 排序算法

每次更改的过程就是不断更新w,(a也就是每次w改变的步长,用a乘以w的偏导)

随机梯度下降算法过程详细解读_python 排序算法

最终当cost为0时,就基本可以保证函数模拟的是正确的。

梯度下降的python实现

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
w = 1.0

def forward(x):
    return x*w
def cost(xs,ys):
    cost = 0
    for x,y in zip(xs,ys):
        y_pred = forward(x)
        cost+=(y_pred - y) **2
    return cost / len(xs)
    '''求平均的cost大小'''


def gradient(xs,ys):
    grad = 0
    for x,y in zip(xs,ys):
        grad += 2*x*(x*w -y)
    return grad/len(xs)
    '''求平均的梯度大小'''

print("Predict (before training)",4,forward(4))
for epoch in range(100):
    cost_val = cost(x_data,y_data)
    grad_val = gradient(x_data,y_data)
    w-=0.1*grad_val
    print('EPOCH:',epoch,'w=',w,'loss=',cost_val)
print("Predict(after training)",4,forward(4))
'''对下一个数据进行预测的结果'''

由于梯度算法,是对所有的差值求平均,因此,很有可能困在局部最优解之中。举个例子,一个人在下山的过程中,不断找周围的最低点,有的人可以直接下山,但是有的人在半山腰山遇到一个水池,对这个水池来说,四周都比它高,因此,就会被困在这个水池中,没法下山。因此解决办法就是随机梯度下降。

随机梯度下降

采用随机梯度下降,相较于求平均的cost,采用随机的loss函数,也就是每次只取一个值,还是上个例子,当这个人困在水池中是,突然随机出现一个点,告诉你你的周围还有更低点,你就可以走出水池,然后重新走向下山的道路

求w的导数函数

随机梯度下降算法过程详细解读_python 排序算法

loss函数

随机梯度下降算法过程详细解读_python 排序算法

对于x,y参数,不像梯度下降的cost函数要遍历x,y的原数据,而只是使用当前的数据x,y即可

随机梯度下降的python实现

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
w = 1.0

def forward(x):
    return x*w

def loss(x,y):
    y_pred = forward(x)
    return(y_pred-y)**2

def gradient(x,y):
    return 2*x*y*(x*w-y)

print('Predict(before training)',4,forward(4))
for epoch in range(100):
    for x,y in zip(x_data,y_data):
'''相比于梯度下降需要一次对所有数据求取平均值,随机梯度下降需要进行两次循环,
    在第二次循环中,对于每个数据都要单独求取一个梯度'''
        grad = gradient(x,y)
        w = w-0.01*grad
        print("grad:",grad)
        '''分别对三个数据求取梯度'''
        l = loss(x,y)
    print("progress:",epoch,"w=",w,"loss",l)
print("Prediect (after training)",4,forward(4))

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195306.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • bfs是什么意思_bfs实现

    bfs是什么意思_bfs实现Rubik 先生在发明了风靡全球的魔方之后,又发明了它的二维版本——魔板。这是一张有 8 个大小相同的格子的魔板:1 2 3 48 7 6 5我们知道魔板的每一个方格都有一种颜色。这 8 种颜色用前 8 个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列 (1,2,3,4,5,6,7,8) 来表示,这是基本状态。这里提供三种基本操作,分别用大写字母 A,B,C 来表示(可以通过这些操作改变魔板

    2022年8月9日
  • CentOS7安装MySQL8.0.12(mysql8版本有的地方还是有坑想好再用)

    CentOS7安装MySQL8.0.12(mysql8版本有的地方还是有坑想好再用)

    2021年6月1日
  • 基于单片机的交通信号灯控制系统设计_交通信号灯程序编程

    基于单片机的交通信号灯控制系统设计_交通信号灯程序编程1、.设计任务交通信号灯控制系统:要求能显示剩余时间和控制红、黄、绿三色灯的显示。2、总体方案设计与方案论证(1)总体方案设计设计路口交通灯控制系统,使用LED显示单元的两组发光二极管(红黄绿)分别模拟十字路口的两组交通灯。a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。c、南北

    2022年9月24日
  • String与StringBuffer的区别?

    String与StringBuffer的区别?String:1.String创建的对象是不可变的,一旦创建不可改变2.对象值可以改变其实是创建了一个新的对象,然后把新的值保存进去(如图1)3.String类被final修饰,不可以被继承4.String创建的对象的值存在于常量池,不用的时候不会被销毁5.String运行时间较长6.String适用于比较短而小的字符串图1StringBuffer:1.StringBuffer创建的对象是可变的2.它的改变不像String那样重新创建对象,而是通过构造方法(如图2)3.StringBu

    2022年9月21日
  • readandwritelock_读写锁使用场景

    readandwritelock_读写锁使用场景ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。ReadWriteLock适用于读多写少的并发

    2022年8月12日
  • Centos防火墙设置与端口开放的方法

    Centos防火墙设置与端口开放的方法Centos升级到7之后,内置的防火墙已经从iptables变成了firewalld。所以,端口的开启还是要从两种情况来说明的,即iptables和firewalld。更多关于CentOs防火墙的最新内容,请参考Redhat官网。一、iptables1.打开/关闭/重启防火墙开启防火墙(重启后永久生效):chkconfigiptableson关闭防火墙(重启

    2022年6月15日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号