Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python实现之梯度下降法

python实现之梯度下降法

作者头像
python与大数据分析
发布于 2022-03-11 08:49:07
发布于 2022-03-11 08:49:07
56100
代码可运行
举报
运行总次数:0
代码可运行

基于前文关于梯度下降法的理解,用python实现梯度下降求解,不过本文不具有通用性,关于求导缺乏通用性,关于梯度也未考虑很多因素,可以看到学习率很低,则收敛较慢,需要大量时间学习,学习率很高,则收敛很快,但有可能找不到极小值。本文只是浅尝辄止。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#                     _ooOoo_
#                   o8888888o
#                    88" . "88
#                 ( | -  _  - | )
#                     O\ = /O
#                 ____/`---'\____
#                  .' \\| |// `.
#                 / \\|||:|||// \
#               / _|||||-:- |||||- \
#                | | \\\ - /// | |
#              | \_| ''\---/'' | _/ |
#               \ .-\__ `-` ___/-. /
#            ___`. .' /--.--\ `. . __
#         ."" '< `.___\_<|>_/___.' >'"".
#       | | : `- \`.;`\  _ /`;.`/ - ` : | |
#          \ \ `-. \_ __\ /__ _/ .-` / /
#      ==`-.____`-.___\_____/___.-`____.-'==
#                     `=---='
'''
@Project :pythonalgorithms
@File :Gradientsolution.py
@Author :不胜人生一场醉@Date :2021/8/3 1:17
'''
import matplotlib.pyplot as plt
import numpy as np
import math


# 函数z=x^2+y^2,用梯度下降法求解,使函数取得最小值
# 首先求梯度 (∂f/∂x,∂f/∂y)=(2x,2y)
# 设定初始值位置 (x0,y0)=(3,2)
# 设定学习率η= 0.1
# 设定学习次数 t=50
# z为当前位置的求解值
# z=x0^2+y0^2
# (Δx,Δy)=-η(∂f/∂x,∂f/∂y)(x0,y0)
# (x1,y1)= (x0,y0)+(Δx,Δy)
# z=x1^2+y1^2
# (Δx,Δy)=-η(∂f/∂x,∂f/∂y)=-η(∂f/∂x,∂f/∂y)(x1,y1)
# (x2,y2)= (x1,y1)+(Δx,Δy)
# z=x2^2+y2^2
# 以此类推进行循环
def solution1(u=0.1):
    xdata = []
    ydata = []
    tdata = []
    print('---------------当前学习率为{}----------------'.format(u))
    x, y, u = 3, 2, u
    for t in range(20):
        z = x ** 2 + y ** 2  # 函数求解
        orgx, orgy = x, y  # 保留当前位置信息
        xdata.append(orgx)
        ydata.append(orgy)
        tdata.append(t)
        xt, yt = x * 2, y * 2  # 求梯度值
        xz, yz = -u * xt, -u * yt  # 求增量值
        x, y = x + xz, y + yz  # 求下一次迭代位置
        print(
            'loop:{},current position=({:+.4f},{:+.4f}),Gradient({:+.4f},{:+.4f}),=step=({:+.4f},{:+.4f}),function value={:+.4f}'.format(
                t, orgx, orgy, xt, yt, xz, yz, z))
    return xdata, ydata, tdata


def drawtrack(xdata, ydata, tdata):
    plt.figure(figsize=(10, 5))
    ax = plt.gca()  # 通过gca:get current axis得到当前轴
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 绘图中文
    plt.rcParams['axes.unicode_minus'] = False  # 绘图负号
    plt.plot(xdata, ydata, "ob")
    for i in range(0, len(xdata)):
        ax.text(xdata[i], ydata[i] + 0.1, tdata[i])

    # 设置图片的右边框和上边框为不显示
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')

    # 挪动x,y轴的位置,也就是图片下边框和左边框的位置
    # data表示通过值来设置x轴的位置,将x轴绑定在y=0的位置
    ax.spines['bottom'].set_position(('data', 0))
    # axes表示以百分比的形式设置轴的位置,即将y轴绑定在x轴50%的位置
    # ax.spines['left'].set_position(('axes', 0.5))
    ax.spines['left'].set_position(('data', 0))
    plt.title("求梯度")
    # plt.legend(loc='upper right')
    plt.show()


if __name__ == '__main__':
    # 学习率0.4,下降很快
    xdata, ydata, tdata = solution1(0.4)
    drawtrack(xdata, ydata, tdata)
    # 学习率0.1
    xdata, ydata, tdata = solution1(0.1)
    drawtrack(xdata, ydata, tdata)
    # 学习率0.01,收敛效果不佳,还需要更长的时间和次数来学习
    xdata, ydata, tdata = solution1(0.01)
    drawtrack(xdata, ydata, tdata)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
C:\Python\Python37\python.exe C:/Python/Pycharm/system_api_test/Gradientsolution.py
---------------当前学习率为0.4----------------
loop:0,current position=(+3.0000,+2.0000),Gradient(+6.0000,+4.0000),=step=(-2.4000,-1.6000),function value=+13.0000
loop:1,current position=(+0.6000,+0.4000),Gradient(+1.2000,+0.8000),=step=(-0.4800,-0.3200),function value=+0.5200
loop:2,current position=(+0.1200,+0.0800),Gradient(+0.2400,+0.1600),=step=(-0.0960,-0.0640),function value=+0.0208
loop:3,current position=(+0.0240,+0.0160),Gradient(+0.0480,+0.0320),=step=(-0.0192,-0.0128),function value=+0.0008
loop:4,current position=(+0.0048,+0.0032),Gradient(+0.0096,+0.0064),=step=(-0.0038,-0.0026),function value=+0.0000
loop:5,current position=(+0.0010,+0.0006),Gradient(+0.0019,+0.0013),=step=(-0.0008,-0.0005),function value=+0.0000
loop:6,current position=(+0.0002,+0.0001),Gradient(+0.0004,+0.0003),=step=(-0.0002,-0.0001),function value=+0.0000
loop:7,current position=(+0.0000,+0.0000),Gradient(+0.0001,+0.0001),=step=(-0.0000,-0.0000),function value=+0.0000
loop:8,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:9,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:10,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:11,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:12,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:13,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:14,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:15,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:16,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:17,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:18,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
loop:19,current position=(+0.0000,+0.0000),Gradient(+0.0000,+0.0000),=step=(-0.0000,-0.0000),function value=+0.0000
---------------当前学习率为0.1----------------
loop:0,current position=(+3.0000,+2.0000),Gradient(+6.0000,+4.0000),=step=(-0.6000,-0.4000),function value=+13.0000
loop:1,current position=(+2.4000,+1.6000),Gradient(+4.8000,+3.2000),=step=(-0.4800,-0.3200),function value=+8.3200
loop:2,current position=(+1.9200,+1.2800),Gradient(+3.8400,+2.5600),=step=(-0.3840,-0.2560),function value=+5.3248
loop:3,current position=(+1.5360,+1.0240),Gradient(+3.0720,+2.0480),=step=(-0.3072,-0.2048),function value=+3.4079
loop:4,current position=(+1.2288,+0.8192),Gradient(+2.4576,+1.6384),=step=(-0.2458,-0.1638),function value=+2.1810
loop:5,current position=(+0.9830,+0.6554),Gradient(+1.9661,+1.3107),=step=(-0.1966,-0.1311),function value=+1.3959
loop:6,current position=(+0.7864,+0.5243),Gradient(+1.5729,+1.0486),=step=(-0.1573,-0.1049),function value=+0.8934
loop:7,current position=(+0.6291,+0.4194),Gradient(+1.2583,+0.8389),=step=(-0.1258,-0.0839),function value=+0.5717
loop:8,current position=(+0.5033,+0.3355),Gradient(+1.0066,+0.6711),=step=(-0.1007,-0.0671),function value=+0.3659
loop:9,current position=(+0.4027,+0.2684),Gradient(+0.8053,+0.5369),=step=(-0.0805,-0.0537),function value=+0.2342
loop:10,current position=(+0.3221,+0.2147),Gradient(+0.6442,+0.4295),=step=(-0.0644,-0.0429),function value=+0.1499
loop:11,current position=(+0.2577,+0.1718),Gradient(+0.5154,+0.3436),=step=(-0.0515,-0.0344),function value=+0.0959
loop:12,current position=(+0.2062,+0.1374),Gradient(+0.4123,+0.2749),=step=(-0.0412,-0.0275),function value=+0.0614
loop:13,current position=(+0.1649,+0.1100),Gradient(+0.3299,+0.2199),=step=(-0.0330,-0.0220),function value=+0.0393
loop:14,current position=(+0.1319,+0.0880),Gradient(+0.2639,+0.1759),=step=(-0.0264,-0.0176),function value=+0.0251
loop:15,current position=(+0.1056,+0.0704),Gradient(+0.2111,+0.1407),=step=(-0.0211,-0.0141),function value=+0.0161
loop:16,current position=(+0.0844,+0.0563),Gradient(+0.1689,+0.1126),=step=(-0.0169,-0.0113),function value=+0.0103
loop:17,current position=(+0.0676,+0.0450),Gradient(+0.1351,+0.0901),=step=(-0.0135,-0.0090),function value=+0.0066
loop:18,current position=(+0.0540,+0.0360),Gradient(+0.1081,+0.0721),=step=(-0.0108,-0.0072),function value=+0.0042
loop:19,current position=(+0.0432,+0.0288),Gradient(+0.0865,+0.0576),=step=(-0.0086,-0.0058),function value=+0.0027
---------------当前学习率为0.01----------------
loop:0,current position=(+3.0000,+2.0000),Gradient(+6.0000,+4.0000),=step=(-0.0600,-0.0400),function value=+13.0000
loop:1,current position=(+2.9400,+1.9600),Gradient(+5.8800,+3.9200),=step=(-0.0588,-0.0392),function value=+12.4852
loop:2,current position=(+2.8812,+1.9208),Gradient(+5.7624,+3.8416),=step=(-0.0576,-0.0384),function value=+11.9908
loop:3,current position=(+2.8236,+1.8824),Gradient(+5.6472,+3.7648),=step=(-0.0565,-0.0376),function value=+11.5160
loop:4,current position=(+2.7671,+1.8447),Gradient(+5.5342,+3.6895),=step=(-0.0553,-0.0369),function value=+11.0599
loop:5,current position=(+2.7118,+1.8078),Gradient(+5.4235,+3.6157),=step=(-0.0542,-0.0362),function value=+10.6219
loop:6,current position=(+2.6575,+1.7717),Gradient(+5.3151,+3.5434),=step=(-0.0532,-0.0354),function value=+10.2013
loop:7,current position=(+2.6044,+1.7363),Gradient(+5.2088,+3.4725),=step=(-0.0521,-0.0347),function value=+9.7973
loop:8,current position=(+2.5523,+1.7015),Gradient(+5.1046,+3.4031),=step=(-0.0510,-0.0340),function value=+9.4094
loop:9,current position=(+2.5012,+1.6675),Gradient(+5.0025,+3.3350),=step=(-0.0500,-0.0333),function value=+9.0368
loop:10,current position=(+2.4512,+1.6341),Gradient(+4.9024,+3.2683),=step=(-0.0490,-0.0327),function value=+8.6789
loop:11,current position=(+2.4022,+1.6015),Gradient(+4.8044,+3.2029),=step=(-0.0480,-0.0320),function value=+8.3352
loop:12,current position=(+2.3542,+1.5694),Gradient(+4.7083,+3.1389),=step=(-0.0471,-0.0314),function value=+8.0051
loop:13,current position=(+2.3071,+1.5380),Gradient(+4.6141,+3.0761),=step=(-0.0461,-0.0308),function value=+7.6881
loop:14,current position=(+2.2609,+1.5073),Gradient(+4.5219,+3.0146),=step=(-0.0452,-0.0301),function value=+7.3837
loop:15,current position=(+2.2157,+1.4771),Gradient(+4.4314,+2.9543),=step=(-0.0443,-0.0295),function value=+7.0913
loop:16,current position=(+2.1714,+1.4476),Gradient(+4.3428,+2.8952),=step=(-0.0434,-0.0290),function value=+6.8105
loop:17,current position=(+2.1280,+1.4186),Gradient(+4.2559,+2.8373),=step=(-0.0426,-0.0284),function value=+6.5408
loop:18,current position=(+2.0854,+1.3903),Gradient(+4.1708,+2.7805),=step=(-0.0417,-0.0278),function value=+6.2818
loop:19,current position=(+2.0437,+1.3625),Gradient(+4.0874,+2.7249),=step=(-0.0409,-0.0272),function value=+6.0330

Process finished with exit code 
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python实现之初等函数一
初等函数是由基本初等函数经过有限次的四则运算和复合运算所得到的函数。基本初等函数和初等函数在其定义区间内均为连续函数。高等数学将基本初等函数归为五类:幂函数、指数函数、对数函数、三角函数、反三角函数。
python与大数据分析
2022/03/11
3370
python实现之初等函数一
python实现之激活函数
激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
python与大数据分析
2022/03/11
4360
python实现之激活函数
python实现之导数
导数(Derivative),也叫导函数值。又名微商,是微积分中的重要基础概念。当函数y=f(x)的自变量x在一点x0上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存在,a即为在x0处的导数,记作f'(x0)或df(x0)/dx。
python与大数据分析
2022/03/11
5470
python实现之导数
python学习之matplot
import matplotlib.pyplot as plt import numpy as np import pandas as pd from mpl_toolkits.mplot3d import Axes3D import matplotlib.gridspec as gridspec from matplotlib import animation
py3study
2020/01/08
7960
python实现之初等函数二——反函数
一般来说,设函数y=f(x)(x∈A)的值域是C,若找得到一个函数g(y)在每一处g(y)都等于x,这样的函数x= g(y)(y∈C)叫做函数y=f(x)(x∈A)的反函数,记作x=f-1(y) 。反函数x=f -1(y)的定义域、值域分别是函数y=f(x)的值域、定义域。最具有代表性的反函数就是对数函数与指数函数。
python与大数据分析
2022/03/11
5980
python实现之初等函数二——反函数
python实现之初等函数三——三角函数
三角函数在python和numpy中实现的不够全面,主要包括cos, cosh, sin sinh, tan, tanh三角函数和arccos, arccosh, arcsin, arcsinh, arctan, arctanh反三角函数,cot,sec,csc,arccot,arcsec,arccsc均为提供,不过可以通过其他函数进行组合或变形得以实现。
python与大数据分析
2022/03/11
1.9K0
python实现之初等函数三——三角函数
通俗易懂讲解梯度下降法!
知乎 | https://zhuanlan.zhihu.com/p/335191534
Datawhale
2022/01/05
1.6K0
通俗易懂讲解梯度下降法!
通俗易懂讲解梯度下降法!
前言:本篇文章用讲解+实战的形式,浅显易懂讲解“梯度下降”,拥有高中数学知识即可看懂。
算法进阶
2022/06/02
3090
通俗易懂讲解梯度下降法!
五万字总结,深度学习基础。「建议收藏」
人工神经网络(Artificial Neural Networks,简写为ANNs)是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的,并具有自学习和自适应的能力。神经网络类型众多,其中最为重要的是多层感知机。为了详细地描述神经网络,我们先从最简单的神经网络说起。
全栈程序员站长
2022/08/31
1K0
五万字总结,深度学习基础。「建议收藏」
Python数据可视化-第6章-坐标轴的定制
matplotlib支持向画布的任意位置添加自定义大小的绘图区域,同时显示坐标轴。通过pyplot模块的axes()函数创建一个Axes类的对象,并将Axes类的对象添加到当前画布中。
用户2225445
2025/04/04
1770
Python数据可视化-第6章-坐标轴的定制
Python—线性回归
折腾了许久,觉得还是要记录点什么,不管是给有兴趣的小伙伴做参考,还是加深自己的学习理解,都是有一定裨益的。
Ed_Frey
2020/11/10
6880
Python—线性回归
python实现之一阶二阶导数
f'(x)=(x^3)‘+(4cosx)‘-(sin(π/2))‘=3x^2-4sinx-0
python与大数据分析
2022/03/11
5870
python实现之一阶二阶导数
梯度下降法Python实现
[梯度下降算法] 几点说明 给定数据集即样本点 求出拟合的直线,给定模型f(x)=kx+b,k,b为要求的参数 定义损失函数(Loss function),回归问题里常用的是平方损失函数 初始化模型f(x)=x+1,即k,b都为1 步长即学习率alpha 代码如下: import numpy as np import matplotlib.pyplot as plt # Size of the points dataset. m = 20 # Points x-coordinate and dummy
_咯噔_
2020/04/12
9810
python实现之极限
“极限”是数学中的分支——微积分的基础概念,广义的“极限”是指“无限靠近而永远不能到达”的意思。数学中的“极限”指:某一个函数中的某一个变量,此变量在变大(或者变小)的永远变化的过程中,逐渐向某一个确定的数值A不断地逼近而“永远不能够重合到A”(“永远不能够等于A,但是取等于A‘已经足够取得高精度计算结果)的过程中,此变量的变化,被人为规定为“永远靠近而不停止”、其有一个“不断地极为靠近A点的趋势”。极限是一种“变化状态”的描述。此变量永远趋近的值A叫做“极限值”(当然也可以用其他符号表示)。
python与大数据分析
2022/03/11
4860
python实现之极限
Python进阶之Matplotlib入门(四)
Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。
HuangWeiAI
2019/10/31
5440
matplotlib学习之基本使用
1.figure学习2.设置坐标轴3.Legend 图例4.Annotation 标注5.tick能见度
公众号guangcity
2019/09/20
7960
matplotlib学习之基本使用
深度学习4大激活函数
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出实际上都是上层输入的线性函数。
皮大大
2023/08/25
4060
深度学习4大激活函数
快速上手matplotlib画图
本文是我在学习莫烦老师视频教程时候整理的笔记。Matplotlib是一个python的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,散点图等。
触摸壹缕阳光
2020/04/26
1.5K0
用Python随手画个图
最近遇到个任务需要画一些坐标图,我就在想,用了这么长时间的 Python 了,能不能用 Python 画图呢?学习一门语言不能只为了学习语言而学习,要做到学以致用。Google 了一下,果然有新的发现,Python 中 matplotlib 库是专门用来画图的,操作了一番后,发现用 Python 画图真的爽,人生苦短,快用 Python!下面简单的介绍一下 matplotlib 库的用法,起到一个抛转引玉的作用,更多好玩的事情等待着咱们一起来探索。
SuperFeng
2019/09/26
2K0
用Python随手画个图
matplotlib 设置移动边框
绘制余弦曲线的代码在 Pycharm 中执行调用,执行的结果会弹出一个独立的桌面端图形界面。这里以二维图形为例,在 matplotlib 中的图形是由几个部分构成,如果想要更好的理解 matplotlib 模块,清楚这几个部分尤为的重要。由于本文主要介绍边框,因此只介绍与之相关的部分。
触摸壹缕阳光
2020/08/13
2.3K0
matplotlib 设置移动边框
相关推荐
python实现之初等函数一
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验