梯度下降计实例计算(二维)
梯度下降计实例计算(二维)
文章目录
- 内容简介
- 示例说明
- 绘制曲线
- 进一步讨论
- 参考资料
内容简介
梯度下降是在机器学习中重要的计算内容。本文就一个具体的示例,展示如何在梯度下降中。
示例说明
设损失函数 y=loss(x)=(x−4)2y=loss(x)=(x-4)^2y=loss(x)=(x−4)2,令此函数的导数为g(x)=y′=loss′(x)=2x−8g(x)=y'=loss'(x)=2x-8g(x)=y′=loss′(x)=2x−8。 在一般情况下,如果可以得到g(x)g(x)g(x),那么只要解出 g(x)=0g(x)=0g(x)=0的根,那么就求得了最小值。比如在本示例中,很容易得到在x=0x=0x=0时,取得最小值。
但是在实际的情况下,问题往往不是那么简单,即使有了 loss(x)loss(x)loss(x) 和 g(x)g(x)g(x),但是方程 g(x)=0g(x)=0g(x)=0,难以解出,那么就有了梯度下降法:
xi+1=xi−r∗loss′(x)(1)x_{i+1}=x_i- r * loss'(x) \tag 1 xi+1=xi−r∗loss′(x)(1)
为了理解这个公式,首先我们需要理解一下导数的基本概念。给定函数 y=f(x)y=f(x)y=f(x),则其导数的定义如下:
f′(x)=limΔx→0ΔyΔx=limΔx→0Δf(x+Δx)−f(x0)Δx(2)f'(x)=\lim_ {\Delta x \rightarrow 0} {\Delta y \over \Delta x} = \lim_ {\Delta x \rightarrow 0} {\Delta f(x+\Delta x) - f(x_0) \over \Delta x} \tag 2 f′(x)=Δx→0limΔxΔy=Δx→0limΔxΔf(x+Δx)−f(x0)(2)
由公式可见,对点x0x0x0的导数的几何含义是函数在点x0x0x0处的变化速率或斜率。当变量增加时,(即多维函数),斜率不再是一维的,于是就有了梯度的概念。梯度是一个向量组合,其几何含义是多维图形中变化速率最快的方向。
有了这个概念再看公式1,可以发现通过r,能够根据y的变化率进行推进,从而逐渐逼近最小值的点。具体过程如下代码所示:
#encoding=utf-8
"""
创建日期:Sun Feb 21 16:19:17 2021
作者信息:郝伟老师
功能简介:
"""import matplotlib.pyplot as plt
import numpy as npdef loss(x):return (x-4)**2def g(x):return 2*x - 8# 初始化值为x0, 学习率为0.9
x0, rate=0, 0.1# 初始化 x和y
x, y=x0, loss(x0)# 记录中间的过程值
xs, ys=[], []
xs.append(x)
ys.append(y)# 循环次数限制在100,保证不会因为递减缓慢而卡死
print('i x y delta_y')
for i in range(100):# 核心代码,根据 g(x)的变化率以r的速度递减x = x - rate * g(x)y_new=loss(x)print('{0}\t{1:.5e}\t{2:.5e}\t{3:.5e}'.format(i+1, x, y, abs(y_new-y)))if abs(y_new - y) < 1e-6:breaky = y_newxs.append(x)ys.append(y)# 绘制递减曲线
plt.plot(xs, ys, 'bo--')# 绘制函数 y=loss(x),其中 x in [0, 8]
xs2=np.arange(0.0, 8.0, 0.1)
ys2=[loss(x) for x in xs2]
plt.plot(xs2, ys2, '-', linewidth=2)plt.show()
绘制曲线
程序运行以后,可以得到以下曲线。
过程数据
i x y delta_y
1 8.00000e-01 1.60000e+01 5.76000e+00
2 1.44000e+00 1.02400e+01 3.68640e+00
3 1.95200e+00 6.55360e+00 2.35930e+00
4 2.36160e+00 4.19430e+00 1.50995e+00
5 2.68928e+00 2.68435e+00 9.66368e-01
6 2.95142e+00 1.71799e+00 6.18475e-01
7 3.16114e+00 1.09951e+00 3.95824e-01
8 3.32891e+00 7.03687e-01 2.53327e-01
9 3.46313e+00 4.50360e-01 1.62130e-01
10 3.57050e+00 2.88230e-01 1.03763e-01
11 3.65640e+00 1.84467e-01 6.64083e-02
12 3.72512e+00 1.18059e-01 4.25013e-02
13 3.78010e+00 7.55579e-02 2.72008e-02
14 3.82408e+00 4.83570e-02 1.74085e-02
15 3.85926e+00 3.09485e-02 1.11415e-02
16 3.88741e+00 1.98070e-02 7.13053e-03
17 3.90993e+00 1.26765e-02 4.56354e-03
18 3.92794e+00 8.11296e-03 2.92067e-03
19 3.94235e+00 5.19230e-03 1.86923e-03
20 3.95388e+00 3.32307e-03 1.19631e-03
21 3.96311e+00 2.12676e-03 7.65635e-04
22 3.97049e+00 1.36113e-03 4.90007e-04
23 3.97639e+00 8.71123e-04 3.13604e-04
24 3.98111e+00 5.57519e-04 2.00707e-04
25 3.98489e+00 3.56812e-04 1.28452e-04
26 3.98791e+00 2.28360e-04 8.22095e-05
进一步讨论
如果,我们选择比较大的步长,比如0.9,那么会导致步长过长,“跨”过最小值,同样可以收敛,得到以下图像。
过程数据
i x y delta_y
1 7.20000e+00 1.60000e+01 5.76000e+00
2 1.44000e+00 1.02400e+01 3.68640e+00
3 6.04800e+00 6.55360e+00 2.35930e+00
4 2.36160e+00 4.19430e+00 1.50995e+00
5 5.31072e+00 2.68435e+00 9.66368e-01
6 2.95142e+00 1.71799e+00 6.18475e-01
7 4.83886e+00 1.09951e+00 3.95824e-01
8 3.32891e+00 7.03687e-01 2.53327e-01
9 4.53687e+00 4.50360e-01 1.62130e-01
10 3.57050e+00 2.88230e-01 1.03763e-01
11 4.34360e+00 1.84467e-01 6.64083e-02
12 3.72512e+00 1.18059e-01 4.25013e-02
13 4.21990e+00 7.55579e-02 2.72008e-02
14 3.82408e+00 4.83570e-02 1.74085e-02
15 4.14074e+00 3.09485e-02 1.11415e-02
16 3.88741e+00 1.98070e-02 7.13053e-03
17 4.09007e+00 1.26765e-02 4.56354e-03
18 3.92794e+00 8.11296e-03 2.92067e-03
19 4.05765e+00 5.19230e-03 1.86923e-03
20 3.95388e+00 3.32307e-03 1.19631e-03
21 4.03689e+00 2.12676e-03 7.65635e-04
22 3.97049e+00 1.36113e-03 4.90007e-04
23 4.02361e+00 8.71123e-04 3.13604e-04
24 3.98111e+00 5.57519e-04 2.00707e-04
25 4.01511e+00 3.56812e-04 1.28452e-04
26 3.98791e+00 2.28360e-04 8.22095e-05
参考资料
[1] (二)深入梯度下降(Gradient Descent)算法,https://www.cnblogs.com/ooon/p/4947688.html
梯度下降计实例计算(二维)相关推荐
- cad计算机面积和周长,CAD怎么计算二维图形的面积和周长
CAD怎么计算二维图形的面积和周长 CAD是一款实用的绘图软件,在工程设计的各个领域里应用十分广泛,具有强大的二维绘图功能,那么我们用CAD怎么计算二维图形的面积和周长呢? 下面来看看具体的实例: ( ...
- C语言:编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递
/*编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递*/ #include<stdio.h> #define N 4 #define M 3 int findmax(int ( ...
- matlab中二维散点图,MATLAB实例:二维散点图
MATLAB实例:二维散点图 用MATLAB实现简单的散点图的绘制,可以自行设置点的形状与颜色,可以去掉坐标轴边框. 数据来源:MATLAB高斯混合数据的生成 将二维数据保存为gauss.txt. 1 ...
- 分别计算二维数组主对角线元素与辅对角线元素的和。
知识点:理解对角线与熟悉二维数组的下标. 二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式].二维数组又称为矩阵,行列数相等 ...
- 高斯 二维 matlab,MATLAB实例:二维高斯分布图
MATLAB实例:二维高斯分布图 问题描述:用MATLAB在一张图上同时画出二维高斯散点图与分布图. 数据来源:MATLAB高斯混合数据的生成 将二维数据保存为gauss_data.txt. 前期工作 ...
- 梯度下降法和牛顿法计算开根号
梯度下降法和牛顿法计算开根号 本文将介绍如何不调包,只能使用加减乘除法实现对根号x的求解.主要介绍梯度下降和牛顿法者两种方法,并给出 C++ 实现. 梯度下降法 思路/步骤 转化问题,将 x \sqr ...
- MATLAB对autumn.tif文件计算二维DCT变换
%对autumn.tif文件计算二维DCT变换 RGB = imread('autumn.tif'); I = rgb2gray(RGB); %真彩色图像转换成灰度图像 J = dct2(I); %计 ...
- lisp 圆柱螺旋线_Auto LISP对AutoCAD2002进行二次开发实例——绘制二维函数曲线
Auto LISP 对 AutoCAD 2002 进行二次开发实例 ---绘制二维函数曲线Ξ李旭荣 ,任奕玲 ,梁秀英 ,刘梅英 (华中农业大学 工程技术学院 ,湖南 武汉 430070) 摘 要:主 ...
- opencv 计算二维矢量的幅值—magnitude()函数
计算二维矢量的幅值:magnitude()函数 该函数用来计算二维矢量的幅值 void magnitude(InputArray x,InputArray y,OutputArray magnitud ...
最新文章
- python的popen函数
- java 搜索机制_Java爬虫搜索原理实现
- 【转】C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
- [react] 在React中我们怎么做静态类型检测?都有哪些方法可以做到?
- 贪心算法(Greedy Algorithm)
- HDU 1827:Summer Holiday(强连通)
- 软件测试基础课程学习笔记7---如何撰写测试报告
- 水起泡器行业调研报告 - 市场现状分析与发展前景预测
- 实例讲解统计学基础知识(1):统计学基础概念
- 2021-2025年中国液压磁力钻行业市场供需与战略研究报告
- 如何改变Android-studio中的APP的名字和图标
- 在java中new一个对象的流程是怎样的
- TKinter美化库——tkkbootstrap
- 计算机锁屏图片怎么设置方法,电脑锁屏照片怎么设置
- HTML---网页编程(2)
- 水星路由器wan口ip显示0_水星路由器WAN口获取不到ip地址怎么办?
- Sony电视投屏 Android,怎样把手机画面投影到电视上观看 乐播投屏使用方法
- 12门课100分,直博清华的学霸火了!“造假都不敢这么写”
- 大学生会计技能竞赛总决赛(三)
- 测试必会Linux命令