随机梯度下降算法过程详细解读_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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 普林斯顿结构和哈佛结构_模具哈佛结构图

    普林斯顿结构和哈佛结构_模具哈佛结构图普林斯顿结构 –通用计算机 ARM7                        –冯诺依曼结构 哈佛结构         –单片机  ARM9ARM10ARM11 普林斯顿结构:指令、数据混合存储,结构简单,成本低。 哈佛结构   :指令、数据分开存储,高速数据处理,可同时读指令、读数据,大大提高了数据吞吐量,缺点是结构复杂。   指令、

    2022年10月5日
    0
  • 568A线序是什么_水晶头a类线序

    568A线序是什么_水晶头a类线序什么情况下会用上568A线序1985年初,计算机工业协会(CCIA)提出对大楼布线系统标准化的倡仪,美国电子工业协会(EIA)和美国电信工业协会(TIA)开始标准化制定工作。1991年7月,ANSI/EIA/TIA568即《商业大楼电信布线标准》问世。1995年底,EIA/TIA568标准正式更新为EIA/TIA/568AEIA/TIA的布线标准中规定了两种双绞线的线序568A与568B。标准568A:绿白-1,绿-2,橙白-3,蓝-4,蓝白-5,橙-6,褐白-7

    2022年10月30日
    0
  • 基础工具之消息队列、线程池、缓冲区抽象、事件循环和日志实现

    正所谓“工欲善其事,必先利其器”,我们在实现通信设计任务的过程中需要一些基础工具来帮助我们搭建部分基础组件,这些基础工具包括消息队列,线程池,缓冲区抽象,事件循环和日志工具。接下来对这部分基础工具进

    2021年12月28日
    40
  • Android setContentView流程[通俗易懂]

    Android setContentView流程[通俗易懂]MainActivity继承Activity的流程MainActivity继承至Activityimportandroid.app.Activity;importandroid.os.Bundle;publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(saved

    2022年6月26日
    28
  • Struts2用AbstractInterceptor取代了AroundInterceptor

    Struts2用AbstractInterceptor取代了AroundInterceptorStruts2中绝大多数预建interceptor都从AbstractInterceptor扩展而来,AbstractInterceptor不在支持before、after两个抽象方法,取而代之的是intercept方法被抽象出来,交由子类去实现。其实大多数interceptor只会去实现before、after中的一个,这样就必须还要在ww中为另一个提供空方法,再由于线程安全问题WW…

    2022年5月14日
    32
  • DMRS与SRS

    DMRS与SRSSRS作用:SRS分类:SRS配置:如果SRS在某个子帧上发送,则SRS将占据该子帧的最后一个SC-FDMA符号上(DMRS在每个子帧的符号3和10),若最后一个SC-FDMA符号分配给SRS,

    2022年8月5日
    17

发表回复

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

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