梯度下降法求解极值、近似根

您所在的位置:网站首页 对号函数的极值点坐标 梯度下降法求解极值、近似根

梯度下降法求解极值、近似根

2023-11-23 21:53| 来源: 网络整理| 查看: 265

目录 一、简介(一)意义(二)描述(三)梯度下降算法的数学解释(四)三种梯度下降法 二、梯度下降法手工求解极值(一)题目(二)计算过程 三、Excel用梯度下降求解近似根四、用Jupyter做线性回归问题求解(一)最小二乘法求解(二)梯度下降法求解(三)对结果进行比较 五、参考资料

一、简介 (一)意义 微分: 函数图像中,某点的切线的斜率/函数的变化率分为单变量微分与多变量微分 梯度下降法: 主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值,是一个一阶最优化算法,通常也称为最速下降法。在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向 (二)描述

梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。 在这里插入图片描述

我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量,同时,这个人此时正好拥有测量出最陡峭方向的能力。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率,来确保下山的方向不错误,同时又不至于耗时太多!

首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向(在后面会详细解释) 所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。那么为什么梯度的方向就是最陡峭的方向呢?

根据梯度的意义梯度实际上就是多变量微分的一般化。 例如:在这里插入图片描述 我们可以看到,梯度就是分别对每个变量进行微分,然后用逗号分割开,梯度是用包括起来,说明梯度其实一个向量。这也就说明了为什么我们需要千方百计的求取梯度!我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点!

(三)梯度下降算法的数学解释 数学公式: 在这里插入图片描述

J是关于Θ的一个函数,我们当前所处的位置为Θ0点,要从这个点走到J的最小值点,也就是山底。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了Θ1这个点! 注意:α(步长/学习率)取值不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点。梯度前加一个负号,意味着朝着梯度相反的方向前进。

(四)三种梯度下降法 批量梯度下降法(Batch Gradient Descent, BGD):批量梯度下降法在计算优化函数的梯度时利用全部样本数据,n表示总的样本数。 计算公式: 在这里插入图片描述 迭代公式: 在这里插入图片描述小批量梯度下降法(Mini-batch Gradient Descent, MBGD) 随机梯度下降法在计算优化函数的梯度时利用随机选择的一个样本数据 梯度计算公式: 在这里插入图片描述 迭代公式: 在这里插入图片描述随机梯度下降法(Stochastic Gradient Descent, SGD) 小批量梯度下降法在计算优化函数的梯度时利用随机选择的一部分样本数据,k表示选取样本的数目 梯度计算公式: 在这里插入图片描述 迭代公式为:在这里插入图片描述三种方式的比较 BGD(批量)SGD(随机)MBGD(小批量)优点非凸函数可保证收敛至全局最优解计算速度快计算速度快,收敛稳定缺点计算速度缓慢,不允许新样本中途进入计算结果不易收敛,可能会陷入局部最优解中—— 二、梯度下降法手工求解极值 (一)题目

在这里插入图片描述

(二)计算过程

1.设置初始点及学习率

初始点: x 0 = ( x 1 0 , x 2 0 ) T = ( 3 , 2 ) T x^0=(x_1^0,x_2^0)^T=(3,2)^T x0=(x10​,x20​)T=(3,2)T学习率: λ λ λ

初始点和学习率是自己随意设置的,这里学习率就不预设值,当然也可以预先设置学习率的值,只不过取值不是很好确定,取值取得不是很好,可能要迭代很多次

2.计算初始点的梯度

梯度计算: ▽ f ( x ) = ( 2 3 x 1 , x 2 ) ▽f(x)=(\frac{2}{3}x_1,x_2) ▽f(x)=(32​x1​,x2​)初始点的梯度(将 x 0 x^0 x0的值代入上面的梯度计算): ▽ f ( x 0 ) = ( 2 , 2 ) ▽f(x^0)=(2,2) ▽f(x0)=(2,2)

3.更新迭代公式

f ( x 1 ) = f ( x 0 , − λ ▽ f ( x 0 ) ) = 10 3 λ 2 − 8 λ + 5 f(x^1)=f(x^0,−λ▽f(x^0))=\frac{10}{3}λ^2-8λ+5 f(x1)=f(x0,−λ▽f(x0))=310​λ2−8λ+5 λ 0 = 6 5 λ ^0=\frac{6}{5} λ0=56​为函数极小点更新后的迭代公式: x 1 = x 0 − λ 0 ▽ f ( x 0 ) = ( 3 5 , − 2 5 ) x^1=x^0-λ^0▽f(x^0)=(\frac{3}{5},-\frac{2}{5}) x1=x0−λ0▽f(x0)=(53​,−52​)重复上面过程可以得到 x 2 = ( 3 5 2 , 2 5 2 ) x^2=(\frac{3}{5^2},\frac{2}{5^2}) x2=(523​,522​)通过总结可以得到 x k = ( 3 5 k , ( − 1 ) k 2 5 k ) x^k=(\frac{3}{5^k},(-1)^k\frac{2}{5^k}) xk=(5k3​,(−1)k5k2​)不断的迭代,直到 x k = ( 0 , 0 ) x^k=(0,0) xk=(0,0) 三、Excel用梯度下降求解近似根 求解 z = 2 ( x − 1 ) 2 + y 2 z=2(x-1)^2+y^2 z=2(x−1)2+y2的近似根

1.设置表格((x,y)的初始值为(2,1)) 在这里插入图片描述 2.在表格里输入相应的计算公式

∂ z ∂ x = 4 ∗ ( x − 1 ) \frac{∂z}{∂x}=4*(x-1) ∂x∂z​=4∗(x−1) ∂ z ∂ y = 2 y \frac{∂z}{∂y}=2y ∂y∂z​=2y Δ x = η ∂ z ∂ x Δx=η\frac{∂z}{∂x} Δx=η∂x∂z​ Δ y = η ∂ z ∂ y Δy=η\frac{∂z}{∂y} Δy=η∂y∂z​ z = 2 ( x − 1 ) 2 + y 2 z=2(x-1)^2+y^2 z=2(x−1)2+y2输入相应的公式的方法: 选中我们需要得出结果的格子位置,敲击“=”键点击要进行计算的格子位置 在这里插入图片描述

3.结果

当一行公式输入完后,框选输入完公式并得出结果的那一行数据,然后直接往下拉,下面的数据会自动计算。

在这里插入图片描述

近似值为 ( 1 , 0 ) (1,0) (1,0),此时极值小接近与零。

四、用Jupyter做线性回归问题求解 (一)最小二乘法求解

1.定义数据集和学习率

from sklearn import linear_model import numpy as np # Size of the points dataset. m = 20 # Points x-coordinate and dummy value (x0, x1). X0 = np.ones((m, 1)) X1 = np.arange(1, m+1).reshape(m, 1) X = np.hstack((X0, X1)) # Points y-coordinate y = np.array([ 3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12, 11, 13, 13, 16, 17, 18, 17, 19, 21 ]).reshape(m, 1)

2.进行线性回归

model = linear_model.LinearRegression() model.fit(X1,y) print("斜率=",model.coef_[0]) print("截距为=",model.intercept_)

在这里插入图片描述

3.绘制线性表

# 根据数据画出对应的图像 def plot(X, y, theta): ax = plt.subplot(111) # 将画布分为1行1列,取第一个 ax.scatter(X, y, s=30, c="blue", marker="s") plt.xlabel("X") plt.ylabel("y") x = np.arange(0, 21, 0.2) # x的范围 y = model.intercept_+ model.coef_[0]*x ax.plot(x, y) plt.show() plot(X1, y, model.coef_[0])

报错: 在这里插入图片描述 解决:引入os模块 import os import matplotlib.pyplot as plt

在这里插入图片描述

(二)梯度下降法求解

1.代价函数 在这里插入图片描述

2.定义数据集及设置相关数据

from numpy import * # 定义数据集的大小 即20个数据点 m = 20 # x的坐标以及对应的矩阵 X0 = ones((m, 1)) # 生成一个m行1列的向量,其值全是1 X1 = arange(1, m+1).reshape(m, 1) # 生成一个m行1列的向量,也就是x1,从1到m X = hstack((X0, X1)) # 按照列堆叠形成数组,其实就是样本数据 # 对应的y坐标 Y = np.array([ 3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12, 11, 13, 13, 16, 17, 18, 17, 19, 21 ]).reshape(m, 1) # 学习率 alpha = 0.01 import matplotlib.pyplot as plt #绘制出数据集 plt.scatter(X1,Y,color='red') plt.show()

在这里插入图片描述

3.定义代价函数及其梯度函数

# 定义代价函数 #损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数 def cost_function(theta, X, Y): diff = dot(X, theta) - Y # dot() 数组需要像矩阵那样相乘,就需要用到dot() return (1/(2*m)) * dot(diff.transpose(), diff) # 定义代价函数对应的梯度函数 def gradient_function(theta, X, Y): diff = dot(X, theta) - Y return (1/m) * dot(X.transpose(), diff)

4.梯度下降迭代

# 梯度下降迭代 def gradient_descent(X, Y, alpha): #将[1,1]变为2行1列的形式 theta = array([1, 1]).reshape(2, 1) #得到代价函数的初始梯度 gradient = gradient_function(theta, X, Y) #不断迭代的过程 while not all(abs(gradient)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3