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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java过滤器与SpringMVC拦截器之间的关系与区别[通俗易懂]

    今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深夜,时间原因,我就把一些网友的观点重点摘录下来,大家仔细看后也一定会有一个比较新的认识(在此非常感谢那些大牛们的无私奉献,分享他们的经验与心得,才能让像我这样的小白有机会站一下你们这些巨人的肩膀,才能

    2022年4月12日
    35
  • 经典递归解决汉诺塔_c语言汉诺塔递归算法

    经典递归解决汉诺塔_c语言汉诺塔递归算法算法:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上

    2022年10月12日
    3
  • [025] 微信公众帐号开发教程第1篇-引言

    [025] 微信公众帐号开发教程第1篇-引言接触微信公众帐号已经有两个多月的时间了,在这期间,除了陆续完善个人公众帐号xiaoqrobot以外,还带领团队为公司开发了两个企业应用:一个是普通类型的公众帐号,另一个是会议类型的公众帐号。经过这3个公众帐号的开发,对目前微信公众平台开放的api算是比较熟悉了,像文本消息、图文消息、音乐消息、语音消息、位置消息等全部用到过,菜单也使用过。所以,就有了写微信公众帐号开发教程的想法,将学习到的技术经验

    2022年6月6日
    48
  • animate.css的使用

    animate.css的使用[1]引入[2]效果演示[3]实际应用

    2022年6月30日
    27
  • 【c#】枚举

    【c#】枚举【c#】枚举

    2022年4月25日
    46
  • AvalonDock使用方法「建议收藏」

    AvalonDock使用方法「建议收藏」点击打开链接源代码下载

    2022年7月20日
    24

发表回复

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

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