Pytorch对Himmelblau函数的优化详解

Pytorch对Himmelblau函数的优化详解

简介

本文将详细讲解使用Pytorch对Himmelblau函数进行优化的完整攻略。Himmelblau函数是一个在数学领域中很有意思的函数,它拥有多个局部极小值点和全局极小值点。在本文中,我们将使用Pytorch来寻找Himmelblau函数的全局最小值。

Himmelblau函数

Himmelblau函数是一个有两个自变量的函数,其数学公式为:

$$f(x,y) = (x^2 + y -11)^2 + (x + y^2 -7)^2 $$

该函数拥有四个局部最小值点,它们分别为:

$$(-0.2708, -0.9231), (0.2708, -0.9231), (-3.7793, -3.2832), (3.5844, -1.8481)$$

还有一个全局最小值点:

$$(3, 2)$$

我们利用Pytorch寻找该函数的最小值点。

Pytorch实现方式

在Pytorch中,我们可以使用torch.optim模块内的类来实现梯度下降(或其他优化算法)。具体而言,我们需要创建一个可训练的变量(Tensor)并在优化器内优化该变量以最小化目标函数。

这里我们使用随机初始化的张量作为待求解的参数,并使用Adam优化器来进行优化。关于Adam优化器的详细细节请查阅论文:《Adam: A Method for Stochastic Optimization》。

import torch
from torch import nn
from torch import optim

# 定义待求解的参数
x = nn.Parameter(torch.tensor([1.0, 1.0]))

# 定义目标函数
def himmelblau(x):
    return (x[0]**2 + x[1] - 11)**2 + (x[0] + x[1]**2 - 7)**2

# 定义优化器
optimizer = optim.Adam([x], lr=0.001)

# 迭代寻找最优值
for i in range(20000):
    # 梯度清零
    optimizer.zero_grad()
    # 计算目标函数
    loss = himmelblau(x)
    # 反向传播求梯度
    loss.backward()
    # 更新参数
    optimizer.step()

    # 打印每次迭代的损失值和参数值
    if i % 1000 == 0:
        print("第{}次迭代: 损失值:{:.2f} 参数值:{}".format(i, loss.item(), [round(xx.item(), 4) for xx in x]))

最后一次迭代打印结果如下:

第19000次迭代: 损失值:0.00 参数值:[2.9999, 1.9999]

通过多次迭代,我们可以找到函数的全局最小值点$(3, 2)$。

下面是另一个示例,我们将目标函数改为不存在闭式解的其它函数:

$$f(x,y) = \sin(x+y) + (x-y)^2 - 1.5x + 2.5y + 1$$

# 定义待求解的参数
x = nn.Parameter(torch.tensor([0.0, 0.0]))

# 定义目标函数
def fun(x):
    return torch.sin(x[0]+x[1]) + (x[0] - x[1])**2 - 1.5*x[0] + 2.5*x[1] + 1

# 定义优化器
optimizer = torch.optim.Adam([x],lr=0.001)

# 迭代寻找最优值
for i in range(20000):
    # 梯度清零
    optimizer.zero_grad()
    # 计算目标函数
    loss = fun(x)
    # 反向传播求梯度
    loss.backward()
    # 更新参数
    optimizer.step()

    # 打印每次迭代的损失值和参数值
    if i % 1000 == 0:
        print("第{}次迭代: 损失值:{:.6f} 参数值:{}".format(i, loss.item(), [round(xx.item(), 6) for xx in x]))

最后一次迭代打印结果如下:

第19000次迭代: 损失值:-1.809279 参数值:[0.748323, 0.746901]

通过多次迭代,我们可以找到函数的全局最小值点$(0.7483, 0.7469)$。

## 结论

本文通过两个示例,详细讲解了使用Pytorch寻找函数最小值的完整过程。在实际应用中,我们可以通过修改目标函数来适用于更多的场景。同时,Pytorch也提供了多种优化器以满足不同的需求。希望本文能为初学者提供一些有益的帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch对Himmelblau函数的优化详解 - Python技术站

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

相关文章

  • dataframe设置两个条件取值的实例

    下面是详细讲解“dataframe设置两个条件取值的实例”的完整攻略。 什么是DataFrame数据类型? DataFrame 是 Pandas 库最核心的数据类型之一,它类似于 Excel 中的电子表格,是以二维表格形式存储数据的数据结构。DataFrame 由 Series 对象构成的字典(key-value)构建而成,每一个 Series 对应一个列。…

    python 2023年6月13日
    00
  • Python实战小项目之身份证信息校验

    Python实战小项目之身份证信息校验 项目说明 此项目旨在实现对中国大陆身份证号码进行校验的功能,以判断身份证号码的有效性与真实性。 实现方法 身份证号码校验的方法可以分为两种:一种是基于规则的校验方法,另一种是基于算法的校验方法。 基于规则的校验方法:通过验证身份证号码的长度、格式、省份、出生日期、性别和校验位等规则,来判断身份证号码是否有效。 基于算法…

    python 2023年6月13日
    00
  • pandas数据处理清洗实现中文地址拆分案例

    下面是“pandas数据处理清洗实现中文地址拆分案例”的完整攻略: 1. 环境准备 首先需要安装所需的Python库,包括pandas、re等。使用pip命令进行安装,如下所示: pip install pandas pip install re 2. 数据获取 获取需要处理的数据,可以从各种渠道获得,比如爬虫抓取、数据采购等。此处以示例数据为例,示例数据为…

    python 2023年6月13日
    00
  • pandas.dataframe按行索引表达式选取方法

    当我们使用pandas库进行数据分析时,最常见的数据格式之一就是数据帧(DataFrame),因此如何对DataFrame进行行索引的操作是非常重要的技能。本文将为大家详细讲解pandas.dataframe按行索引表达式选取方法,并且包含两个示例说明。 一、pandas.dataframe按行索引表达式选取方法 在pandas中,对DataFrame进行行…

    python 2023年6月13日
    00
  • python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法

    Python 是一种高级编程语言,而 pyautogui 是 Python 的模块之一,可以模拟鼠标、键盘的操作。在 Python 中如何调用 pyautogui 并实时获取鼠标位置、移动鼠标呢?下面我将详细讲解这个方法的攻略。 环境准备 在使用此方法前,需要确保你的电脑上已经安装了 Python 和 pyautogui 模块。安装方法可参考官方文档或 pi…

    python 2023年6月13日
    00
  • 对pandas将dataframe中某列按照条件赋值的实例讲解

    对于Pandas将DataFrame中某列按照条件赋值的实例,可以分为以下步骤进行: 使用Pandas读取数据并创建DataFrame对象。 定义被用来更新某列数据的条件(statement)。 使用.loc[condition, ‘column’]来定位符合条件的某列数据,并进行更新。 以下是两个具体的示例: 示例一:将DataFrame中某列大于3的数全…

    python 2023年6月13日
    00
  • Pycharm报错Non-zero exit code (2)的完美解决方案

    下面是完整的“Pycharm报错 Non-zero exit code (2) 的完美解决方案”攻略: 1. 问题背景 在使用 Pycharm 编写 Python 代码时,我们有时候会遇到这样的问题:当我们尝试运行一个程序或调试一个程序时,Pycharm 给出了这样的错误:Non-zero exit code (2)。对于这个问题,我们需要知道它的原因以及如…

    python 2023年6月13日
    00
  • pandas实现选取特定索引的行

    选取特定索引的行通常用于数据的筛选和分析。在pandas中,可以使用loc和iloc方法实现选取特定索引的行。 loc方法 语法 df.loc[行索引, 列索引] 示例 例如,有一个包含成绩和姓名的数据集,包括以下内容: 姓名 语文 数学 英语 张三 70 80 90 李四 80 70 60 王五 60 90 80 如果要选取李四的成绩,可以使用loc方法:…

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