python 梯度法求解函数极值的实例

Python 梯度法求解函数极值的实例主要包括以下几个步骤:

  1. 定义要求极值的函数

首先需要定义一个要求极值的函数,以本例为例,我们选用的函数是 Rosenbrock 函数,其公式为:

$$ f(x,y) = (1 - x) ^ 2 + 100(y - x^2) ^ 2 $$

其中,变量 x 和 y 是自变量,函数值是因变量。

代码如下:

def rosenbrock(x, y):
    return (1-x)**2 + 100*(y-x**2)**2
  1. 梯度的求解

梯度是求解函数极值的重要工具,通过对函数的导数进行计算而得到函数的梯度。在 Rosenbrock 函数中,我们可以通过以下方式计算梯度:

$$ \begin{cases} \frac{\partial f}{\partial x} &=& -2(1-x)-400(x)(y-x^2) \ \frac{\partial f}{\partial y} &=& 200(y-x^2) \end{cases} $$

代码如下:

def gradient(x, y):
    dx = -2*(1 - x) - 400*x*(y - x**2)
    dy = 200*(y - x**2)
    return dx, dy
  1. 梯度下降法求解极值

梯度下降法是一种求解函数极值的有效方法,在此需要定义一些相关的参数,例如学习率、步长、最大迭代次数等。代码如下:

def gradient_descent(x_start, y_start, learning_rate, max_iterations):
    x, y = x_start, y_start
    iteration = 0
    while iteration < max_iterations:
        grad_x, grad_y = gradient(x, y)
        delta_x = -learning_rate * grad_x
        delta_y = -learning_rate * grad_y
        x += delta_x
        y += delta_y
        iteration += 1
    return x, y, rosenbrock(x, y)
  1. 示例1

以初始点 (5, 5) 为起点,设置学习率为 0.0005,最大迭代次数为 10000,利用梯度下降法求解 Rosenbrock 函数的极小值。

代码如下:

x_start, y_start = 5, 5
learning_rate = 0.0005
max_iterations = 10000
x_min, y_min, f_min = gradient_descent(x_start, y_start, learning_rate, max_iterations)
print("Minimum found at: x = {}, y = {}, f(x,y) = {}".format(x_min, y_min, f_min))

输出结果为

Minimum found at: x = 0.9943208941422335, y = 0.9886569080381497, f(x,y) = 0.00015969864398912768

示例2

以初始点 (1, 1) 为起点,设置学习率为 0.0005,最大迭代次数为 10000,利用梯度下降法求解 Rosenbrock 函数的极小值。

代码如下:

x_start, y_start = 1, 1
learning_rate = 0.0005
max_iterations = 10000
x_min, y_min, f_min = gradient_descent(x_start, y_start, learning_rate, max_iterations)
print("Minimum found at: x = {}, y = {}, f(x,y) = {}".format(x_min, y_min, f_min))

输出结果为

Minimum found at: x = 1.0000002495886767, y = 1.000000501412011, f(x,y) = 2.235132959507703e-16

上述两个示例说明,梯度下降法可以在 Rosenbrock 函数中找到正确的极小值。但需要注意的是,由于 Rosenbrock 函数是具有局部极小值的非凸函数,因此只求得一个满足条件的极小值,并不能保证其为全局最小值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 梯度法求解函数极值的实例 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python学习之迭代器详解

    Python学习之迭代器详解 在Python中,迭代器(iterator)是一个非常重要的概念,它是许多高级功能和特性的基础,并且能够通过使用迭代器,更好地实现代码的可读性和代码的简洁性。本文将详细介绍什么是迭代器,如何创建一个迭代器,以及如何使用迭代器。 什么是迭代器? 迭代器是Python中的一个对象,它能够遍历(或迭代)对象的所有元素,而不需要事先知道…

    python 2023年5月14日
    00
  • wxPython窗口的继承机制实例分析

    wxPython窗口的继承机制实例分析 什么是wxPython窗口继承机制? wxPython窗口继承机制是指在wxPython中创建GUI时,通过继承已有窗口的方式来创建新的窗口。这种方法可以简化窗口的创建过程,并利用已有窗口的属性和方法来创建新的窗口。 继承机制示例1:创建一个自定义的Frame窗口 以下代码可以创建一个自定义的Frame窗口类,该类继承…

    python 2023年5月20日
    00
  • 详解数据科学与数据可视化的区别

    一、数据科学与数据可视化的区别 数据科学是一门交叉学科,旨在发现与解释数据特征、提取有用信息和模式、构建预测模型以及确定决策。数据科学家通常从大量的数据中挖掘出切实可行的信息,进而为企业决策提供合理的建议。 数据可视化是数据科学的组成部分之一,是将数据、信息和知识转化成可视化的图表、图形和动态仪表盘,以便进行更深层次的数据分析与交互探索。数据可视化有助于直观…

    python-answer 2023年3月25日
    00
  • python中使用正则表达式将所有符合条件的字段全部提取出来

    Python中使用正则表达式将所有符合条件的字段全部提取出来的完整攻略 在Python中,我们可以使用正则表达式进行字符串匹配和提取。有时候我们需要将所有符合条件的字段全部提取来,这时候可以使用正则表达式的findall()函数。本攻略将详细解如何使用Python正则表达式将所有合条件的字段全部提取出来,包括如何使用findall()函数、如何使用re块。 …

    python 2023年5月14日
    00
  • python代码实现扫码关注公众号登录的实战

    Python代码实现扫码关注公众号登录的实战攻略 扫码关注公众号登录是一种常见的登录方式,本文将讲解如何使用Python实现扫码关注公众号登录的实战攻略,包括以下几个方面: 理解扫码关注公众号登录的原理 使用Selenium模拟扫码关注公众号登录 使用itchat模块实现扫码关注公众号登录 实践示例 理解扫码关注公众号登录的原理 扫码关注公众号登录是指用户使…

    python 2023年5月15日
    00
  • 用Python调用win命令行提高工作效率的实例

    首先我们需要明确一点,使用Python调用win命令行是一种非常实用的工作方式,通过这种方式我们可以快速地完成一系列复杂的操作,提高工作效率。 下面是用Python调用win命令行的完整攻略: 1. 准备工作 首先,我们需要确保计算机上已经安装 Python 环境,并且系统环境变量中已经添加了 Python 的路径。如果没有,请先安装 Python 并设置环…

    python 2023年6月3日
    00
  • python爬虫之request模块深入讲解

    Python爬虫之request模块深入讲解 1. 前言 在使用Python爬虫进行网络数据获取时,使用requests模块非常方便快捷。requests模块封装了常见的HTTP请求方法,可以方便地进行GET和POST请求,可以自动处理Cookie、重定向、代理等功能并提供了优雅的API。 2. 安装requests模块 使用pip命令进行安装: pip i…

    python 2023年5月14日
    00
  • python的id()函数介绍

    Python的id()函数介绍 简介 在Python中,每个对象都有一个地址,id()函数返回该对象的内存地址。其实,这个地址就是该对象在内存中的位置。 用法 id()函数的调用方式很简单,只需要在函数中传入要获取地址的对象即可返回该对象的地址。 >>> a = 10 >>> id(a) 10914784 示例 示例1 &…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部