Nelder–Mead Simplex Algorithm

Reference:
http://home.agh.edu.pl/~pba/pdfdoc/Numerical_Optimization.pdf
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
http://www.jasoncantarella.com/downloads/NelderMeadProof.pdf

算法

先直接来看算法:



解释

对于我们要求解最小值的函数f(x)f(x), 我们有n+1n+1个点以及对应的函数值使其满足f(x1)<f(x2)<...<f(xn)<f(xn+1)f(x_1). 每一次我们都对值最大的点进行优化,具体的算法如上图所示。

x¯=Σnixi\bar{x}=\Sigma_i^n x_i 是前n个点的质心(centroid),找到对于质心xn+1x_{n+1}的反射点(reflection point):x¯(t)=x¯+t(xn+1−x¯)\bar{x}(t) = \bar{x}+t(x_{n+1}-\bar{x})

如下图所示,x¯(−1)\bar{x}(-1)就是反射点,x¯(−2)\bar{x}(-2)就是对应的两倍路径的反射点,而x¯(1/2)\bar{x}(1/2)是xn+1x_{n+1}和x¯\bar{x}的中点。

再来看算法的具体步骤,每一次我们都找到最差点xn+1x_{n+1},然后求出x¯(−1)\bar{x}(-1)。(对于蓝字注释的变换,请见源代码一节前的图示)

  1. 如果x(−1){x}(-1)的值f−1f_{-1}在f(x1)f(x_1)和f(xn)f(x_n)之间,也就是说新找到的点不是最好的也不是最坏的,那么将其替换最差点,进行下一次循环。(reflection)

  2. 如果x(−1){x}(-1)的值f−1<f(x1)f_{-1},那么我们找到了一个新的最优点,也就是说这个方向可能是找到最小值的最佳方向。想象一个山丘中出现的峡谷,这个方向就好比通往峡谷的下坡,所以我们沿这个方向再看一看有没有更好的解,继续计算f−2f_{-2}。(reflection and expansion)
    2.1 如果f−2<f−1f_{-2},那么将x−2x_{-2}替换xn+1x_{n+1} 进行下一次循环。
    2.2 如果f−2>f−1f_{-2}>f_{-1},那么将x−1x_{-1}替换xn+1x_{n+1} 进行下一次循环。

  3. 如果x(−1){x}(-1)的值f−1>f(xn)f_{-1}>f(x_n),即新的点仍然比x1x_1到xnx_n都差
    3.1 找到x(−1/2){x}(-1/2),如果f−1/2<f−1f_{-1/2},那么用x(−1/2){x}(-1/2)替代xn+1x_{n+1} 进行下一次循环。(contraction)
    3.2 如果x(−1){x}(-1)的值f−1>f(xn+1)f_{-1}>f(x_{n+1}),即新的点比现有所有点都差,这大概率说明我们的simplex可能已经到了最低点的周围,这时候应该向simplex内部找最优解。找到内部点x(1/2){x}(1/2),如果f1/2<fn+1f_{1/2},那么用x(1/2){x}(1/2)替代xn+1x_{n+1}。进行下一次循环。

  4. 如果按照以上方法找到的内外部的点全部没有更优化,那么将整体simplex向x(1){x}(1)收缩,因为x(1){x}(1)的函数值是目前我们知道最小的。(multiple contraction)

源代码(scipy)

optimize.py 中的_minimize_neldermead() 是 Nelder–Mead Simplex 算法的核心程序,迭代算法集中体现在以下的这个循环中。

    while (fcalls[0] < maxfun and iterations < maxiter):if (numpy.max(numpy.ravel(numpy.abs(sim[1:] - sim[0]))) <= xatol andnumpy.max(numpy.abs(fsim[0] - fsim[1:])) <= fatol):breakxbar = numpy.add.reduce(sim[:-1], 0) / N #得到centroidxr = (1 + rho) * xbar - rho * sim[-1] #rho=1 得到新的点xrfxr = func(xr) // 对应的fxr函数值doshrink = 0if fxr < fsim[0]:xe = (1 + rho * chi) * xbar - rho * chi * sim[-1] # chi=2fxe = func(xe) # xe 就是x(-2)if fxe < fxr: # 算法步骤2.1sim[-1] = xefsim[-1] = fxeelse:  # 算法步骤2.2sim[-1] = xrfsim[-1] = fxrelse:  # fsim[0] <= fxrif fxr < fsim[-2]: # 算法步骤1sim[-1] = xrfsim[-1] = fxrelse:  # fxr >= fsim[-2]# Perform contraction # 算法步骤3if fxr < fsim[-1]:xc = (1 + psi * rho) * xbar - psi * rho * sim[-1] # psi = 0.5 算法步骤3.1fxc = func(xc)if fxc <= fxr:sim[-1] = xcfsim[-1] = fxcelse:doshrink = 1else:# Perform an inside contractionxcc = (1 - psi) * xbar + psi * sim[-1]fxcc = func(xcc) # 算法步骤3.2if fxcc < fsim[-1]:sim[-1] = xccfsim[-1] = fxccelse:doshrink = 1if doshrink: #算法步骤4 整体收缩for j in one2np1:sim[j] = sim[0] + sigma * (sim[j] - sim[0])fsim[j] = func(sim[j])ind = numpy.argsort(fsim)sim = numpy.take(sim, ind, 0)fsim = numpy.take(fsim, ind, 0)if callback is not None:callback(sim[0])iterations += 1if retall:allvecs.append(sim[0])

scipy.optimize.minimize 的优化算法(1): Nelder–Mead Simplex相关推荐

  1. python scipy.optimize.minimize多变量多参数优化

    python scipy.optimize.minimize多变量多参数优化 x是一维变量,无超参数 x是二维变量,无超参数,带bounds x是二维变量,有一个超参数,带bounds x是二维变量, ...

  2. 基于 scipy.optimize.minimize 方法对 MindQuantm 搭建的变参量子线路进行优化

    基于 scipy.optimize.minimize 方法对 MindQuantm 搭建的变参量子线路进行优化. 任务详情请参考 MindQuantum 官网 import numpy as np i ...

  3. Scipy优化scipy.optimize.minimize

    如果喜欢请点赞,收藏,谢谢! 要解决一个优化问题 m i n i m i z e x [ 0 ] , x [ 1 ] \mathrm{minimize}_{x[0],x[1]} minimizex[0 ...

  4. scipy.optimize.minimize参数

    scipy.optimize.minimize 英文文档 scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=N ...

  5. 非线性规划(scipy.optimize.minimize)

    1.minimize() 函数介绍 在 python 里用非线性规划求极值,最常用的就是 scipy.optimize.minimize(). [官方介绍点这里](Constrained minimi ...

  6. python非线性规划scipy.optimize.minimize介绍

    目录 0. 官方说明 1. Parameters 2. Returns 3. 案例 1)无约束求极值 2)有约束求极值 参考资料 0. 官方说明 在 python 里用非线性规划求极值,最常用的就是 ...

  7. 利用scipy.optimize.minimize()求解有约束、非线性规划问题

    ''' scipy.optimize.minimize(目标函数obj,初始点,constraints=cons,bounds=bd)此函数有很多参数,这里介绍主要参数 obj:目标函数,最小值形式, ...

  8. python数学建模之用scipy.optimize.minimize解决高次非线性规划问题

    在实际的数学建模应用中,我们会遇到很多约束条件是二次的,三次的或者是高次函数的情况,这样用 optimize.linprog()来解决就显得不适用了,因此我们使用scipy.optimize下得min ...

  9. Nelder Mead SIMPLEX Algorithm

    Nelder Mead SIMPLEX Algorithm 单纯形 算法 Nelder-Mead 算法的简单实现 示例 Rosenbrock函数 用Nelder-Mead Simplex算法优化 最后 ...

最新文章

  1. 把Excel文件中的数据读入到DataGrid中
  2. java递归排雷_C语言实现扫雷小游戏
  3. 解释上采样和PixelShuffle
  4. php 表单跳转,html - 思路问题:php表单跳转
  5. sql的加减乘除运算_小白学sql(一)
  6. win python 判断 所有 子进程 结束_python 多进程 进程池子进程结束怎么获取
  7. win10调节屏幕亮度_Win8系统笔记本电脑如何调节屏幕亮度?
  8. android webview js交互 第一节 (java和js交互)
  9. PHP foreach如何判断是数组最后一个元素
  10. C# 中的委托和事件 (转)
  11. JUC学习之CountDownLatch入门
  12. 【日语学习】动词、形容词、名词的敬体形、简体形
  13. 网页自动加拼音html,HTML5:给汉字加拼音?让我秀给你看
  14. python就业班-淘宝-目录.txt
  15. 【mcuclub】MQ系列气体传感器
  16. 电驴怎么显示服务器列表,(转)如何更新电驴服务器列表(eMule Server List)
  17. [JavaScript犀牛书]第二章 词法结构
  18. GCC 编译 C(C++)静态链接库(gcc -L、gcc -l)和动态链接库(gcc -fPIC -shared)的创建和使用
  19. SRTP/SRTCP协议
  20. 使用图片需注意,侵权事件屡发生

热门文章

  1. 微信营销七(微信朋友圈发文技巧)
  2. MS5358 适合用于像 DTV,DVR 和 AV 接收器的系统
  3. 【嵌入式】GPIO驱动LED设计
  4. ssm基于Java的微小企业人事管理系统的设计与实现毕业设计源码231012
  5. VC驿站全套视频在线观看(B站)
  6. 转:浙大高分子物理郑强教授的震撼人心的演讲
  7. css 动画 呼吸 呼吸灯 效果
  8. 网络安全学习(千锋网络安全笔记)2--IP与基本DOS命令
  9. 2D平台类游戏开发教程(翻译)
  10. echarts3 实现中国地图