📌 目录
scipy.optimize
模块简介- 无约束优化:
minimize
函数 - 约束优化:带约束的
minimize
- 多变量优化
- 非线性最小二乘拟合:
curve_fit
- 全局优化:
differential_evolution
- 示例:曲线拟合与数据拟合
- 出站链接与参考资料
1. scipy.optimize
模块简介
scipy.optimize
提供了广泛的优化算法,包括:
- 无约束最小化
- 约束最小化
- 非线性最小二乘拟合
- 全局优化(遗传算法、粒子群等)
- 数值求解(线性方程、方程组)
该模块对许多应用场景非常重要,如机器学习中的模型训练、工程中的结构优化、经济学中的资源分配等。
2. 无约束优化:minimize
函数
scipy.optimize.minimize
是最常用的最小化函数,支持多种优化算法。
基本用法
from scipy.optimize import minimize
# 目标函数
def objective(x):
return x**2 + 5*x + 10
# 初始猜测
x0 = [0]
# 无约束最小化
result = minimize(objective, x0)
print(result.x) # 最优解
优化算法选择
minimize
函数支持不同的优化算法,如:
'BFGS'
(拟牛顿法)'Nelder-Mead'
(单纯形法)'Powell'
(Powell 法)'CG'
(共轭梯度法)
result = minimize(objective, x0, method='Nelder-Mead')
3. 约束优化:带约束的 minimize
通过设置约束条件来限制优化过程。
等式约束
# 等式约束:x + y = 1
cons = ({'type': 'eq', 'fun': lambda x: x[0] + x[1] - 1})
result = minimize(objective, [0, 0], constraints=cons)
print(result.x) # 最优解
不等式约束
# 不等式约束:x >= 0
cons = ({'type': 'ineq', 'fun': lambda x: x[0]})
result = minimize(objective, [-1], constraints=cons)
print(result.x) # 最优解
4. 多变量优化
优化多个变量的目标函数。
# 多变量目标函数:f(x, y) = x^2 + y^2
def objective_multivariable(x):
return x[0]**2 + x[1]**2
# 初始猜测
x0 = [1, 1]
# 多变量优化
result = minimize(objective_multivariable, x0)
print(result.x) # 最优解
5. 非线性最小二乘拟合:curve_fit
用于数据拟合,常用于实验数据与模型的拟合。
示例:线性拟合
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 模拟数据:y = 2*x + 1 + noise
x_data = np.linspace(0, 10, 100)
y_data = 2 * x_data + 1 + np.random.normal(0, 1, size=100)
# 拟合函数:y = a*x + b
def model(x, a, b):
return a * x + b
# 使用 curve_fit 拟合
params, covariance = curve_fit(model, x_data, y_data)
# 绘图展示
plt.scatter(x_data, y_data, label="Data")
plt.plot(x_data, model(x_data, *params), color='red', label="Fitted line")
plt.legend()
plt.show()
print("拟合参数:", params)
6. 全局优化:differential_evolution
适用于寻找全局最优解,尤其在多峰函数中。
示例:全局最小化
from scipy.optimize import differential_evolution
# 目标函数:多峰函数
def objective(x):
return x**2 * np.sin(x)
# 设置搜索范围
bounds = [(-10, 10)]
# 全局优化
result = differential_evolution(objective, bounds)
print("全局最优解:", result.x)
7. 示例:曲线拟合与数据拟合
示例:指数衰减拟合
# 模拟数据:y = A * exp(-b * x) + noise
def model_exp(x, A, b):
return A * np.exp(-b * x)
# 模拟 x 和 y 数据
x_data = np.linspace(0, 10, 100)
y_data = 5 * np.exp(-0.5 * x_data) + np.random.normal(0, 0.1, size=100)
# 使用 curve_fit 拟合
params, _ = curve_fit(model_exp, x_data, y_data)
# 绘图展示
plt.scatter(x_data, y_data, label="Data")
plt.plot(x_data, model_exp(x_data, *params), color='red', label="Fitted curve")
plt.legend()
plt.show()
print("拟合参数:", params)
🔗 出站链接与参考资料
📘 官方文档
- SciPy 优化模块:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html curve_fit
函数:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
🎓 教程与实战
- SciPy 优化教程:
https://scipy-lectures.org/advanced/optimization/ - Real Python 曲线拟合与优化:
https://realpython.com/python-optimization/
发表回复