【scipy 基础】--最优化
SciPy库的optimize模块主要用于执行各种优化任务。
优化是寻找特定函数的最小值或最大值的过程,通常用于机器学习、数据分析、工程和其他领域。
scipy.optimize提供了多种优化算法,包括梯度下降法、牛顿法、最小二乘法等,可以解决各种复杂的优化问题。
该模块还包含一些特定的函数,用于解决某些特定类型的优化问题,如多维非线性优化、约束优化、最小二乘问题等。
此外,scipy.optimize还提供了一些工具,如多线程支持、边界条件处理、数值稳定性措施等,以提高优化的效率和准确性。
1. 主要功能
最优化是数学学科中的一个重要研究领域,optimize模块包含的各类函数能够帮助我们节省大量的计算时间和精力。
| 类别 | 说明 |
|---|---|
| 优化 | 包含标量函数优化,局部优化,全局优化等各类方法 |
| 最小二乘法和曲线拟合 | 包含求解最小二乘法问题,各种拟合曲线的方法 |
| 求根 | 包含多种求根的方法,比如布伦特方法,牛顿-拉夫森方法等10来种求根方法 |
| 线性规划 | 内置多种线性规划算法以及混合整数线性规划计算等 |
| 分配问题 | 解决线性和分配问题,包括二次分配和图匹配问题的近似解等 |
| 工具函数 | 包含一些通用的计算方法,比如有限差分近似,海森近似,线搜索等计算函数 |
| 遗留函数 | 即将被淘汰的一些函数,不建议再继续使用 |
下面通过曲线拟合和非线性方程组求解两个示例演示optimize模块的使用。
2. 曲线拟合示例
所谓曲线拟合,其实就是找到一个函数,能够尽可能的经过或接近一系列离散的点。
然后就可以用这个函数来预测离散点的变化趋势。
2.1. 最小二乘法
optimize模块的最小二乘法拟合曲线需要定义一个目标函数和一个残差函数。
最小二乘法通过迭代寻找目标函数中参数的最优值,
而残差函数是用来计算目标函数的返回值和实际值之间的误差的。
首先,加载需要拟合的离散数据。
import pandas as pd
data = pd.read_csv("d:/share/data/A0A01.csv")
data = data[data["zb"] == "A0A0101"]
data = data.sort_values("sj")
data.head()

数据来源:https://databook.top/nation/A0A (其中的A0A01.csv)
然后,依据其中1978年~2022年的居民人均可支配收入绘制散点图。
from matplotlib.ticker import MultipleLocator
import matplotlib.pyplot as plt
ax = plt.subplot()
ax.scatter(data["sjCN"], data["value"], marker='*', color='r')
ax.xaxis.set_major_locator(MultipleLocator(4))
ax.set_title("居民人均可支配收入(元)")
plt.xticks(rotation=45)
plt.show()

最后,用optimize模块提供的最小二乘法拟合居民人均可支配收入的变化曲线。
from scipy.optimize import least_squares
# 目标函数
def target_func(p, x):
return p[0]*np.exp(p[1]*x) + p[2]
# 残差函数
def residual(p, x, dy):
return target_func(p, x) - dy
p0 = [1, 1, 0]
x = range(len(data))
y = data["value"]
# 最小二乘法迭代目标函数的参数
result = least_squares(residual, p0, args=(x, y))
ax = plt.subplot()
ax.xaxis.set_major_locator(MultipleLocator(4))
ax.set_title("居民人均可支配收入(元)")
ax.scatter(data["sjCN"], data["value"], marker='*', color='r')
# 这里的result.x就是迭代后的最优参数
ax.plot(x, target_func(result.x, x), color='g')
plt.xticks(rotation=45)
plt.show()

图中绿色的曲线就是拟合的曲线,根据拟合出的曲线和目标函数,
就可以预测以后的居民人均可支配收入的变化情况。
2.2. curve_fit方法
最小二乘法需要定义目标函数和残差函数,使用起来有些繁琐,optimize模块中还提供了一个curve_fit函数。
可以简化曲线拟合的过程。
from scipy.optimize import curve_fit
# 目标函数
def curve_fit_func(x, p0, p1, p2):
return p0*np.exp(p1*x) + p2
# fitp 就是计算出的目标函数的最优参数
fitp, _ = curve_fit(curve_fit_func, x, y, [1, 1, 0])
ax = plt.subplot()
ax.xaxis.set_major_locator(MultipleLocator(4))
ax.set_title("居民人均可支配收入(元)")
ax.scatter(data["sjCN"], data["value"], marker='*', color='r')
ax.plot(x, curve_fit_func(x, *fitp), color='b')
plt.xticks(rotation=45)
plt.show()

蓝色的线就是拟合曲线,拟合结果和使用最小二乘法拟合出的是一样的,只是代码可以简化一些。
3. 非线性方程组求解示例
众所周知,手工求解非线性方程是非常困难的,如果经常遇到求解非线性方程的情况,optimize模块绝对能成为你的一个称手工具。
3.1. 非线性方程
使用optimize模块求解非线性方程非常简单。
比如方程:\(2^x+sin(x)-x^3=0\)
from scipy.optimize import root
f = lambda x: 2**x + np.sin(x) - x**3
result = root(f, [1, 1], method='hybr')
# result.x 是方程的解
result.x
# 运行结果:
array([1.58829918, 1.58829918])
实际使用时,将变量f对应的方程换成你的方程即可。
注意,求解方程的 root 方法的参数method,这个参数支持多种求解方程的方法,可以根据方程的特点选择不同的method。
支持的method列表可参考官方文档:https://docs.scipy.org/doc/scipy/reference/optimize.html#multidimensional
3.2. 非线性方程组
对于方程组,求解的方法如下:
比如方程组:\(\begin{cases}
\begin{align*}
x^2 +y-3 & =0 \\
(x-2)^2+y-1 & =0
\end{align*}
\end{cases}\)
fs = lambda x: np.array(
[
x[0] ** 2 + x[1] - 3,
(x[0] - 2) ** 2 + x[1] - 1,
]
)
result = root(fs, [1, 1], method="hybr")
result.x
# 运行结果:
array([1.5 , 0.75])
方程组中方程个数多的话,直接添加到变量fs的数组中即可。
4. 总结
总的来说,scipy.optimize是一个强大且易用的优化工具箱,用于解决各种复杂的优化问题。
它对于需要优化算法的许多科学和工程领域都具有重要价值。
通过使用这个模块,用户可以节省大量时间和精力,同时还能保证优化的质量和准确性。
【scipy 基础】--最优化的更多相关文章
- SciPy 基础功能
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy - 科学计算库(上)
SciPy - 科学计算库(上) 一.实验说明 SciPy 库建立在 Numpy 库之上,提供了大量科学算法,主要包括这些主题: 特殊函数 (scipy.special) 积分 (scipy.inte ...
- 003 Scipy库简介
参考文档补充原本的文档: https://www.cnblogs.com/mrchige/p/6504324.html 一:原本的简单介绍 1.Scipy库 Scipy库是基于python生态的一款开 ...
- python-数据处理的包Numpy,scipy,pandas,matplotlib
一,NumPy包(numeric python,数值计算) 该包主要包含了存储单一数据类型的ndarry对象的多维数组和处理数组能力的函数ufunc对象.是其它包数据类型的基础.只能处理简单的数据分析 ...
- SciPy 信号处理
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 统计
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 线性代数
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 图像处理
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 优化
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 积分
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
随机推荐
- 我用WebGL打造了一款动态壁纸
我用WebGL打造了一款动态壁纸 简述 最近在给自己电脑换壁纸的时候发现了一张很有特点的图(就是下面这张),于是我突发奇想,要是能把这张图变成一张动态的壁纸.那该多好.于是我打算用threejs开发一 ...
- Unity的IPreprocessShaders:深入解析与实用案例
Unity IPreprocessShaders Unity IPreprocessShaders是Unity引擎中的一个非常有用的功能,它可以让开发者在编译Shader时自定义哪些操作需要被执行.这 ...
- RocketMQ Linux单机测试:简易快速部署指南及Dashboard控制台部署
目录 简介 开始 下载 增加环境变量 修改启动文件jvm大小 修改rocketmq配置文件 启动 快速测试 关闭 Dashboard 下载Dashboard 已编译jar包网盘下载 启动命令 可能遇到 ...
- 操作系统实验——利用Linux的消息队列通信机制实现两个线程间的通信
目录 一. 题目描述 二.实验思路 三.代码及实验结果 四.遇到问题及解决方法 五.参考文献 一. 题目描述 编写程序创建三个线程:sender1线程.sender2线程和receive线程,三个线程 ...
- 《深入理解Java虚拟机》读书笔记:Class类文件的结构
Class类文件的结构 Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的的程序存储格式--字节码(ByteCode),从而实现了程序 ...
- Linux虚拟机报错Job for network.service failed because the control process exited with error codeLinux虚拟机报错的解决方法
发布于 2 天前 3 次阅读 Linux虚拟机设置静态ip后,突然发现联网连不上了,ssh也无法使用,重启network后仍旧无法使用.按照网络上的方法发现没有效果后,右键如下位置将nat模式转换为 ...
- 深入探讨API调用性能优化与错误处理
随着互联网技术的不断发展,API(应用程序接口)已经成为软件系统中重要的组成部分.而优化API调用的性能以及处理错误和异常情况则是保障系统稳定性和可靠性的关键.本文将从以下几个方面来探讨如何进行性 ...
- MapReduce核心概念及架构
MapReduce简介 MapReduce常用于对大规模数据集(大于1TB)的并行运算,或对大数据进行加工.挖掘和优化等处理. MapReduce将并行计算过程高度抽象到了两个函数map和reduce ...
- pygame 入门实例教程 1 - 复古方块赛车游戏
作者自我介绍:大爽歌, b站小UP主 ,直播编程+红警三 ,python1对1辅导老师 . 本教程步骤明确,过程清晰简明,最终代码量250行上下,适合学习pygame的新手. 项目代码已上传到我的gi ...
- webapi开发框架实践
项目链接以及目录结构 liuzhixin405/efcore-template (github.com) 这是一个纯webapi的开发框架. 1.支持的orm有efcore6.dapper,可以灵活切 ...