基于梯度下降算法的无约束函数极值问题求解

这篇具有很好参考价值的文章主要介绍了基于梯度下降算法的无约束函数极值问题求解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 知识预警

1.1导数

导数(Derivative),也叫导函数值。又名微商,是微积分中的重要基础概念。
基于梯度下降算法的无约束函数极值问题求解,机器学习,算法,机器学习,人工智能,梯度下降算法

导数是函数的局部性质。一个函数在某一点的导数描述了这个函数在这一点附近的变化率。如果函数的自变量和取值都是实数的话,函数在某一点的导数就是该函数所代表的曲线在这一点上的切线斜率。导数的本质是通过极限的概念对函数进行局部的线性逼近。例如在运动学中,物体的位移对于时间的导数就是物体的瞬时速度。

对于一条直线来说,求该直线的斜率就是找到该直线上两个点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2),分别求出两点在 y y y x x x上的增量。因此斜率就是 y y y的改变量比上 x x x的改变量,即 k = tan ⁡ θ = Δ y Δ x = y 2 − y 1 x 2 − x 1 k=\tan\theta =\frac{\Delta y}{\Delta x}=\frac{y_2-y_1}{x_2-x_1} k=tanθ=ΔxΔy=x2x1y2y1

对于不是直线该如何求斜率呢?因为曲线我们是不能笼统的随意找出两点,从而像直线一样求出它的斜率,而是以直代曲,近似的求出曲线在某一点的斜率。我们用的是该点的瞬时变化率,也就是求出该点处切线的斜率。

基于梯度下降算法的无约束函数极值问题求解,机器学习,算法,机器学习,人工智能,梯度下降算法

1.2偏导数

定义:设函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)的某一领域内有定义,当 y y y固定在 y 0 y_0 y0,而 x x x x 0 x_0 x0处有增量时,相应地函数有增量: f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 ) f(x_0+\Delta x,y_0)-f(x_0,y_0) f(x0+Δx,y0)f(x0,y0),如果 lim ⁡ Δ x → 0 f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 ) Δ x \lim_{\Delta x \rightarrow 0 \frac{f(x_0+\Delta x,y_0)-f(x_0,y_0)}{\Delta x}} limΔx0Δxf(x0+Δx,y0)f(x0,y0)存在,则称此极限为函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处对 x x x地偏导数,记为 ∂ z ∂ x ∣ ( x 0 , y 0 ) \frac{\partial z}{\partial x}|_{(x_0,y_0)} xz(x0,y0) ∂ f ∂ x ∣ ( x 0 , y 0 ) \frac{\partial f}{\partial x}|_{(x_0,y_0)} xf(x0,y0) z x ( x 0 , y 0 ) z_x(x_0,y_0) zx(x0,y0) f x ( x 0 , y 0 ) f_x(x_0,y_0) fx(x0,y0),即 f x ( x 0 , y 0 ) = lim ⁡ Δ x → 0 f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 ) Δ x = d d x f ( x , y 0 ) ∣ x = x 0 f_x(x_0,y_0)=\lim_{\Delta x \rightarrow 0 \frac{f(x_0+\Delta x,y_0)-f(x_0,y_0)}{\Delta x}}= \frac {\mathrm{d}}{\mathrm{d} x}f(x,y_0)|_{x=x_0} fx(x0,y0)=limΔx0Δxf(x0+Δx,y0)f(x0,y0)=dxdf(x,y0)x=x0

同理,可定义函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处对 y y y的偏导数,为 lim ⁡ Δ y → 0 f ( x 0 , y 0 + Δ y ) − f ( x 0 , y 0 ) Δ y \lim_{\Delta y \rightarrow 0}{ \frac{f(x_0,y_0+\Delta y)-f(x_0,y_0)}{\Delta y}} limΔy0Δyf(x0,y0+Δy)f(x0,y0),记为 ∂ z ∂ y ∣ ( x 0 , y 0 ) \frac{\partial z}{\partial y}|_{(x_0,y_0)} yz(x0,y0) ∂ f ∂ y ∣ ( x 0 , y 0 ) \frac{\partial f}{\partial y}|_{(x_0,y_0)} yf(x0,y0) z y ( x 0 , y 0 ) z_y(x_0,y_0) zy(x0,y0) f y ( x 0 , y 0 ) f_y(x_0,y_0) fy(x0,y0),即 f x y ( x 0 , y 0 ) = lim ⁡ Δ y → 0 f ( x 0 , y 0 + Δ y ) − f ( x 0 , y 0 ) Δ y = d d y f ( x 0 , y ) ∣ y = y 0 f_xy(x_0,y_0)=\lim_{\Delta y \rightarrow 0}{ \frac{f(x_0 ,y_0+\Delta y)-f(x_0,y_0)}{\Delta y}}= \frac {\mathrm{d}}{\mathrm{d} y}f(x_0,y)|_{y=y_0} fxy(x0,y0)=limΔy0Δyf(x0,y0+Δy)f(x0,y0)=dydf(x0,y)y=y0

如果函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在区域D内任意一点(x,y)处对x的偏导数都存在,那么这个偏导数就是x、y的函数,它就称为函数 z = f ( x , y ) z=f(x,y) z=f(x,y)对自变量x的偏导函数,简称偏导数,记作 ∂ z ∂ x \frac{ \partial z}{ \partial x} xz ∂ f ∂ x \frac{ \partial f}{ \partial x} xf z x z_x zx f x ( x , y ) f_x(x,y) fx(x,y)

同理,可以定义函数 z = f ( x , y ) z=f(x,y) z=f(x,y)对自变量y的偏导数,记作 ∂ z ∂ y \frac{ \partial z}{ \partial y} yz ∂ f ∂ y \frac{ \partial f}{ \partial y} yf z y z_y zy f y ( x , y ) f_y(x,y) fy(x,y)

偏导数的概念可以推广到二元以上函数,如u=f(x,y,z)在(x,y,z)处:
f x ( x , y , z ) = lim ⁡ Δ x → 0 f ( x + Δ x , y , z ) − f ( x , y , z ) Δ x f_x(x,y,z) = \lim_{\Delta x \rightarrow 0} \frac{f(x+\Delta x,y,z) - f(x,y,z)}{\Delta x} fx(x,y,z)=Δx0limΔxf(x+Δx,y,z)f(x,y,z) f x ( x , y , z ) = lim ⁡ Δ y → 0 f ( x , y + Δ y , z ) − f ( x , y , z ) Δ y f_x(x,y,z) = \lim_{\Delta y \rightarrow 0} \frac{f(x,y+\Delta y,z) - f(x,y,z)}{\Delta y} fx(x,y,z)=Δy0limΔyf(x,y+Δy,z)f(x,y,z) f x ( x , y , z ) = lim ⁡ Δ x z → 0 f ( x , y , z + Δ z ) − f ( x , y , z ) Δ z f_x(x,y,z) = \lim_{\Delta xz \rightarrow 0} \frac{f(x,y,z+\Delta z) - f(x,y,z)}{\Delta z} fx(x,y,z)=Δxz0limΔzf(x,y,z+Δz)f(x,y,z)

【注】偏导数只能表示多元函数沿某个坐标轴方向的导数,如对于二元函数 f ( x , y ) = x 2 + y 2 f(x,y)=x^2+y^2 f(x,y)=x2+y2 ∂ z ∂ x = 2 x \frac{\partial z}{\partial x}=2x xz=2x表示函数沿着x轴方向的导数; ∂ z ∂ y = 2 y \frac{\partial z}{\partial y}=2y yz=2y表示函数沿着y轴方向的导数;

1.3方向导数

除了沿坐标轴方向上的导数,多元函数在非坐标轴方向上也可以求导数,这种导数称为方向导数。很容易发现,多元函数在特定点的方向导数有无穷多个,表示函数值在各个方向上的增长速度。一个很自然的问题是:在这些方向导数中,是否存在一个最大的方向导数,如果有,其值是否唯一?为了回答这个问题,便需要引入梯度的概念。

1.4梯度

连续可微的多元函数 f ( x 1 , x 2 , ⋯   , x n ) f(x_1,x_2,\cdots,x_n) f(x1,x2,,xn),用矢量表示其在点 ( x 1 , x 2 , ⋯   , x n ) (x_1,x_2,\cdots,x_n) (x1,x2,,xn)的梯度为 ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , ⋯   , ∂ f ∂ x n ) ( \frac{\partial f}{ \partial x_1},\frac{\partial f}{ \partial x_2},\cdots,\frac{\partial f}{ \partial x_n} ) (x1f,x2f,,xnf),表示f在该点沿着梯度方向函数值增长最快,梯度的模增长的程度。 ( − ∂ f ∂ x 1 , − ∂ f ∂ x 2 , ⋯   , − ∂ f ∂ x n ) ( -\frac{\partial f}{ \partial x_1},-\frac{\partial f}{ \partial x_2},\cdots,-\frac{\partial f}{ \partial x_n} ) (x1f,x2f,,xnf)则表示负梯度,沿着负梯度方向函数值减小最快。

梯度是一个向量(矢量), 表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

基于梯度下降算法的无约束函数极值问题求解,机器学习,算法,机器学习,人工智能,梯度下降算法

因此可以沿着梯度方向,搜索极值点(梯度下降算法)。

2 梯度下降算法

梯度下降法,又叫最速下降算法,是机器学习中一种常用到的算法,但其本身不是机器学习算法,而是一种求解的最优化算法,用于无约束多元函数求极值问题。在机器学习中,优化问题的目标函数通常是建立一个损失函数 L ( θ ) \mathcal L (\theta) L(θ),使损失函数最小化 min ⁡ L ( θ ) \min \mathcal L(\theta) minL(θ),梯度下降算法通过不断更新:
θ t : = θ t − α ∇ L ( θ t ) \begin{align} \theta_{t}:=\theta_{t}-\alpha \nabla \mathcal L(\theta_t) \end{align} θt:=θtαL(θt)

基于梯度下降算法的无约束函数极值问题求解,机器学习,算法,机器学习,人工智能,梯度下降算法
  1. 初始化迭代次数,学习率 α \alpha α,起点
  2. L ( θ 1 , θ 2 , ⋯   , θ n ) \mathcal{L}(\theta_1,\theta_2,\cdots,\theta_n) L(θ1,θ2,,θn)在点 ( θ 1 , θ 2 , ⋯   , θ n ) (\theta_1,\theta_2,\cdots,\theta_n) (θ1,θ2,,θn)的梯度 ( ∂ L ∂ θ 1 , ∂ L ∂ θ 2 , ⋯   , ∂ L ∂ θ n ) ( \frac{\partial \mathcal{L}}{ \partial \theta_1},\frac{\partial \mathcal{L}}{ \partial \theta_2},\cdots,\frac{\partial \mathcal{L}}{ \partial \theta_n} ) (θ1L,θ2L,,θnL)
  3. 对每一个 θ i \theta_i θi采用式(1)进行更新;
  4. 计算损失函数 L ( θ 1 , θ 2 , ⋯   , θ n ) \mathcal{L}(\theta_1,\theta_2,\cdots,\theta_n) L(θ1,θ2,,θn)的值;
  5. 满足终止条件?是输出全局最优解,否转step2。

3 无约束函数极值问题求解

3.1 算例1

求函数 min ⁡ f ( x , y ) = 2 ( x − 1 ) 2 + y 2 \min f(x,y)=2(x-1)^2+y^2 minf(x,y)=2(x1)2+y2的极小值点,该函数的全局极小值点为 f ( 1 , 0 ) = 0 f(1,0)=0 f(10)=0

3.1.1 Python编程求解

"""
梯度下降SGD+多元函数求极值问题
求 f(x,y)=2(x-1)^2+y^2 的极小值
https://blog.csdn.net/MrKaj/article/details/115448804
"""
# 导入所需库
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import math
from mpl_toolkits.mplot3d import Axes3D
import warnings


def plotFig(midRes):
    fig = plt.figure()
    ax = Axes3D(fig, auto_add_to_figure=False)
    fig.add_axes(ax)  # 设置图像为三维格式
    X = np.arange(-10, 10, 0.1)
    Y = np.arange(-10, 10, 0.1)  # X,Y的范围
    X, Y = np.meshgrid(X, Y)  # 绘制网格
    Z = 2 * (X - 1) ** 2 + Y ** 2  # f(x,y)=(sin(x)*sin(y))/(x*y),注意括号
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
    lx = [i[0] for i in midRes]
    ly = [i[1] for i in midRes]
    lz = [i[2] for i in midRes]
    ax.plot(lx, ly, lz, label='parametric curve', marker="o", linewidth=2, markersize=5, color='#000000')
    # 绘制3D图,后面的参数为调节图像的格式

    plt.show()  # 展示图片


# 原函数
def f(x, y):
    return 2 * (x - 1) ** 2 + y ** 2


# x方向上的梯度
def dx(x):
    return 4 * x - 4


# y方向上的梯度
def dy(y):
    return 2 * y


def gradient(x, y):
    return 4 * x - 4, 2 * y


# 初始值
X = x0 = 10
Y = y0 = 10
# 学习率
alpha = 0.1
# 保存梯度下降所经过的点
midRes = [[x0, y0, f(x0, y0)]]
# 迭代30次
maxIter = 50

if __name__ == "__main__":
    for i in range(maxIter):
        pdx, pdy = gradient(X, Y)
        X = X - alpha * pdx
        Y = Y - alpha * pdy
        Z = f(X, Y)
        print(u"iter=%d  x=%f  y=%f  z=%f" % (i, X, Y, Z))
        midRes.append([X, Y, Z])
    # 打印结果
    print(u"最终结果为:(x,y,z)=(%.5f, %.5f, %.5f)" % (X, Y, f(X, Y)))
    plotFig(midRes)


3.1.2 求解结果与可视化


iter=49  x=1.000000  y=0.000143  z=0.000000
最终结果为:(x,y,z)=(1.00000, 0.00014, 0.00000)
基于梯度下降算法的无约束函数极值问题求解,机器学习,算法,机器学习,人工智能,梯度下降算法

3.2 算例2 Rosenbrock函数

在数学最优化中,Rosenbrock函数是一个用来测试最优化算法性能的非凸函数,由Howard Harry Rosenbrock在1960年提出 。也称为Rosenbrock山谷或Rosenbrock香蕉函数,也简称为香蕉函数。Rosenbrock函数的每个等高线大致呈抛物线形,其全域最小值也位在抛物线形的山谷中(香蕉型山谷),位于 (x,y)=(1,1)点,数值为f(x,y)=0,图像如下图所示:
文章来源地址https://www.toymoban.com/news/detail-541137.html

基于梯度下降算法的无约束函数极值问题求解,机器学习,算法,机器学习,人工智能,梯度下降算法
题目:使用梯度下降算法寻找Rosenbrock函数$f(x,y)=(1-x)^2+100(y-x^2)^2$的最小值。

3.2.1 Python编程求解

"""
梯度下降法
f(x,y)=(1-x)^2+100(y-x^2)^2
"""
import numpy as np
from matplotlib import pyplot as plt, ticker
from mpl_toolkits.mplot3d import Axes3D


def plotFig(f, midRes=None):
    fig = plt.figure()
    ax = Axes3D(fig, auto_add_to_figure=False)
    fig.add_axes(ax)  # 设置图像为三维格式
    X = np.arange(-1, 1, .1)
    Y = np.arange(-1, 1, .1)  # X,Y的范围
    X, Y = np.meshgrid(X, Y)  # 绘制网格
    Z = f(X, Y)
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap="rainbow", alpha=0.3)  # alpha控制透明度

    lx = [i[0] for i in midRes]
    ly = [i[1] for i in midRes]
    lz = [i[2] for i in midRes]
    ax.plot(lx, ly, lz, label='parametric curve', marker="*", linewidth=1, markersize=1, color='#000000')

    plt.show()


def f(x, y):
    return (1 - x) ** 2 + 100 * (y - x ** 2) ** 2


def gradient(x, y):
    return 400 * x * (x ** 2 - y) + 2 * x - 2, 200 * (y - x ** 2)


if __name__ == "__main__":
    X = x0 = -1
    Y = y0 = -1
    alpha = 0.002

    midRes = [[x0, y0, f(x0, y0)]]
    maxIter = 10000
    for i in range(maxIter):
        pdx, pdy = gradient(X, Y)
        X = X - alpha * pdx
        Y = Y - alpha * pdy
        Z = f(X, Y)
        print(u"iter=%d  x=%f  y=%f  z=%f" % (i, X, Y, Z))
        midRes.append([X, Y, Z])
    print(u"最终结果为:(x,y,z)=(%.5f, %.5f, %.5f)" % (X, Y, f(X, Y)))
    plotFig(f, midRes)

3.2.2 求解结果与可视化

iter=9999  x=0.999906  y=0.999811  z=0.000000
最终结果为:(x,y,z)=(0.99991, 0.99981, 0.00000)
基于梯度下降算法的无约束函数极值问题求解,机器学习,算法,机器学习,人工智能,梯度下降算法

到了这里,关于基于梯度下降算法的无约束函数极值问题求解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习笔记之优化算法(十六)梯度下降法在强凸函数上的收敛性证明

    本节将介绍: 梯度下降法 在 强凸函数 上的收敛性,以及 证明过程 。 凸函数与强凸函数 关于 凸函数 的定义使用 数学符号 表示如下: ∀ x 1 , x 2 ∈ R n , ∀ λ ∈ ( 0 , 1 ) ⇒ f [ λ ⋅ x 2 + ( 1 − λ ) ⋅ x 1 ] ≤ λ ⋅ f ( x 2 ) + ( 1 − λ ) ⋅ f ( x 1 ) forall x_1,x_2 in mathbb R^n, forall

    2024年02月11日
    浏览(43)
  • 【Sklearn】基于随机梯度下降算法的数据分类预测(Excel可直接替换数据)

    随机梯度下降(Stochastic Gradient Descent,SGD)是一种优化算法,用于训练模型的参数以最小化损失函数。在分类任务中,SGD也可以用于训练分类模型。下面是SGD分类预测的模型原理和数学公式的概述。 模型原理 SGD分类器是基于线性模型的分类器,它使用随机梯度下降优化算法

    2024年02月12日
    浏览(37)
  • 举例说明基于线性回归的单层神经网络网络(以梯度下降算法来求解权重的过程)...

    我们将通过一个简单的例子来说明基于线性回归的单层神经网络,以及如何使用梯度下降算法来求解权重。 假设我们有以下数据集,表示学生的学习时间(小时)与他们的考试分数: 学习时间(X):1, 2, 3, 4, 5 考试分数(Y):2, 4, 6, 8, 10 这是一个线性关系,我们可以使用线

    2024年02月16日
    浏览(85)
  • 机器学习(七):梯度下降解决分类问题——perceptron感知机算法与SVM支持向量机算法进行二维点分类

    实验2 感知机算法与支持向量机算法 一、预备知识 1.感知机算法 二、实验目的 掌握感知机算法的原理及设计; 掌握利用感知机算法解决分类问题。 三、实验内容 设计感知机算法求解, 设计SVM算法求解(可调用函数库),请找出支持向量和决策超平面。 四、操作方法和实验

    2023年04月26日
    浏览(89)
  • 优化算法之梯度下降|Matlab实现梯度下降算法

    题目要求: 使用Matab实现梯度下降法 对于函数: min ⁡ f ( x ) = 2 x 1 2 + 4 x 2 2 − 6 x 1 − 2 x 1 x 2 min f(x)=2 x_{1}^{2}+4 x_{2}^{2}-6 x_{1}-2 x_{1} x_{2} min f ( x ) = 2 x 1 2 ​ + 4 x 2 2 ​ − 6 x 1 ​ − 2 x 1 ​ x 2 ​ 试采用 MATLAB实现最速下降法求解该问题, 给出具体的迭代过程、 最终优化结果、

    2024年02月16日
    浏览(50)
  • 【数学建模】二次规划求解约束极值问题(Python+Gurobi实现)

    目录 1 概述 2 算例及Python代码实现 2.1 算例 2.2 方法1 2.3 方法1求解结果 2.4 方法2         根据约束条件的不同,二次规划可分为等式约束二次规划问题和不等式约束二次规划问题。等式约束二次规划问题即只含有等式约束,常见的解法有直接消去法、广义消去法、拉格朗日

    2024年02月08日
    浏览(69)
  • 深度学习之梯度下降算法

    0.1 学习视频源于:b站:刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容,若有错误欢迎指正! 1 线性模型 1.1 通过简单的线性模型来举例:   1.2 如图,简单的一个权重的线性模型,首先通过随机取w的值来找到与true line重合的w,其中通过MSE来判断w取值是否

    2024年02月15日
    浏览(42)
  • pytorch(二)梯度下降算法

    在线性模型训练的时候,一开始并不知道w的最优值是什么,可以使用一个随机值来作为w的初始值,使用一定的算法来对w进行更新 寻找使得目标函数最优的权重组合的问题就是优化问题 通俗的讲,梯度下降就是使得梯度往下降的方向,也就是负方向走。一般来说,梯度往正

    2024年01月21日
    浏览(34)
  • 【机器学习】P2 线性回归、损失函数与梯度下降

    线性回归简单的说就是线性函数; 线性回归属于机器学习 回归问题; 在线性回归建立的线性关系的模型中,假设目标变量和自变量之间存在一种线性关系,模型的目标是找到最佳的拟合线,是的模型对于未知的数据能够进行最准确的预测; 线性回归模型的一般形式为: y

    2023年04月08日
    浏览(42)
  • 梯度下降算法(Gradient descent)

         首先,我们需要明确梯度下降就是求一个函数的最小值,对应的梯度上升就是求函数最大值。简而言之: 梯度下降的目的就是求函数的极小值点, 例如在最小化损失函数或是线性回归学习中都要用到梯度 下降算法。       ##梯度下降算法作为很多算法的一个关键环节

    2024年01月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包