📌 目录
scipy.optimize
模块简介- 最小化问题:无约束与有约束优化
- 常见优化方法:
minimize
和least_squares
- 多目标优化
- 示例:最小化函数与约束优化
- 出站链接与参考资料
1. scipy.optimize
模块简介
scipy.optimize
模块提供了一系列函数,用于求解最优化问题,包括无约束和有约束的最小化、最小二乘拟合、非线性方程求解等。它支持多种优化方法,如梯度下降法、牛顿法、遗传算法等。
2. 最小化问题:无约束与有约束优化
无约束优化
无约束优化是最常见的优化问题,其中目标函数的最小值不受任何约束。scipy.optimize
提供了 minimize
函数来处理这类问题。
from scipy.optimize import minimize
# 定义目标函数(最小化问题)
def objective(x):
return x[0]**2 + x[1]**2 # 二次函数
# 初始猜测值
x0 = [1, 2]
# 调用 minimize 函数进行优化
result = minimize(objective, x0)
# 输出结果
print("最小值的位置:", result.x)
print("最小值:", result.fun)
有约束优化
有约束优化问题不仅需要最小化目标函数,还需要满足一定的约束条件。SciPy 提供了对线性和非线性约束的支持。
# 定义约束条件
def constraint(x):
return x[0] + x[1] - 1 # x[0] + x[1] 应等于 1
# 初始猜测值
x0 = [0.5, 0.5]
# 约束条件的字典
cons = ({'type': 'eq', 'fun': constraint})
# 调用 minimize 函数进行优化
result = minimize(objective, x0, constraints=cons)
# 输出结果
print("最小值的位置:", result.x)
print("最小值:", result.fun)
3. 常见优化方法:minimize
和 least_squares
minimize
函数
minimize
是 SciPy 中最常用的最小化函数,支持多种优化方法。例如,BFGS(拟牛顿法)、TNC(梯度投影法)等。
# 使用 BFGS 方法进行最小化
result = minimize(objective, x0, method='BFGS')
print("最小值的位置:", result.x)
print("最小值:", result.fun)
least_squares
函数
least_squares
函数用于解决最小二乘问题,适用于拟合数据或解过定方程组的优化问题。
from scipy.optimize import least_squares
# 定义残差函数
def residuals(x):
return x[0] * np.exp(-x[1] * np.linspace(0, 10, 100)) - np.sin(np.linspace(0, 10, 100))
# 初始猜测值
x0 = [1, 1]
# 使用 least_squares 函数进行优化
result = least_squares(residuals, x0)
# 输出结果
print("最优参数:", result.x)
print("最小化后的残差:", result.fun)
4. 多目标优化
在某些应用中,我们需要进行多目标优化,即同时优化多个目标函数。这类问题通常没有明确的最优解,而是找到一个帕累托最优解集(Pareto optimal solutions)。
虽然 scipy.optimize
没有直接提供多目标优化的函数,但可以通过将多个目标函数结合成一个复合目标函数来进行求解。
# 定义两个目标函数
def objective1(x):
return x[0]**2 + x[1]**2
def objective2(x):
return (x[0] - 1)**2 + (x[1] - 1)**2
# 合并目标函数
def combined_objective(x):
return objective1(x) + objective2(x)
# 初始猜测值
x0 = [1, 2]
# 使用 minimize 进行优化
result = minimize(combined_objective, x0)
# 输出结果
print("最优解位置:", result.x)
print("最小化后的目标值:", result.fun)
5. 示例:最小化函数与约束优化
无约束优化示例
from scipy.optimize import minimize
# 定义目标函数
def f(x):
return (x - 2) ** 2
# 初始猜测
x0 = [0]
# 调用 minimize 函数进行最小化
res = minimize(f, x0)
# 输出结果
print("最小值位置:", res.x)
print("最小值:", res.fun)
有约束优化示例
# 定义目标函数
def objective(x):
return (x[0] - 1)**2 + (x[1] - 2.5)**2
# 定义约束
def constraint(x):
return x[0] + x[1] - 3
# 初始猜测值
x0 = [0, 0]
# 约束条件
cons = {'type': 'eq', 'fun': constraint}
# 使用 minimize 函数进行优化
res = minimize(objective, x0, constraints=cons)
# 输出结果
print("最优解:", res.x)
🔗 出站链接与参考资料
📘 官方文档
- SciPy
optimize
模块:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html minimize
函数:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.htmlleast_squares
函数:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.least_squares.html
🎓 教程与实战
- SciPy 优化教程:
https://scipy-lectures.org/advanced/optimization/ - Python 最优化问题解决方案:
https://realpython.com/optimizing-functions-in-python-with-scipy/
发表回复