如何为Scipy.minimize传入初始单纯形?Nelder Mead报错示例
Nelder-Mead算法initial_simplex参数的正确用法
形状要求说明
报错ValueError: initial_simplex should be an array of shape (N+1,N)里的N是优化问题的变量维度:
- 若为N维优化问题(比如优化2个变量),初始单纯形必须是
(N+1)×N的二维数组 - 数组的每一行代表单纯形的一个顶点,N维空间里的单纯形需要
N+1个顶点来构成
最小可运行示例
以下是基于Scipy的Nelder-Mead算法,使用initial_simplex的完整示例:
from scipy.optimize import minimize import numpy as np # 定义目标函数(二维二次函数,最小值在(1,2)) def objective(x): return (x[0] - 1)**2 + (x[1] - 2)**2 # 构造初始单纯形:2维问题需3个顶点(3行2列) initial_simplex = np.array([ [0, 0], [0, 3], [3, 0] ]) # 调用优化:x0可设为None,initial_simplex会覆盖它 result = minimize( objective, x0=None, method='Nelder-Mead', initial_simplex=initial_simplex ) print("最优解:", result.x) print("最终单纯形:", result.simplex)
从指定点重启优化
如果需要从之前的优化状态重启,直接传入上次优化得到的单纯形即可(result.simplex保存了最后一步的单纯形):
# 基于之前的单纯形重启优化 restart_result = minimize( objective, x0=None, method='Nelder-Mead', initial_simplex=result.simplex ) print("重启后的最优解:", restart_result.x)
常见错误排查
- 数组行数不为
N+1:比如2维问题只传2个顶点(2行2列),会触发形状错误 - 数组列数与变量维度不匹配:比如2维问题传入3列的数组,同样会报错
内容的提问来源于stack exchange,提问作者Felix Hermann
相关产品推荐
相关产品推荐

