用Python实现最速下降法求极值的方法


Posted in Python onJuly 10, 2019

对于一个多元函数用Python实现最速下降法求极值的方法,用最速下降法(又称梯度下降法)求其极小值的迭代格式为

用Python实现最速下降法求极值的方法

其中用Python实现最速下降法求极值的方法为负梯度方向,即最速下降方向,αkαk为搜索步长。

一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜索,但是更常用的是不精确线性搜索,主要是Goldstein不精确线性搜索和Wolfe法线性搜索。

为了调用的方便,编写一个Python文件,里面存放线性搜索的子函数,命名为linesearch.py,这里先只编写了Goldstein线性搜索的函数,关于Goldstein原则,可以参看最优化课本。

线性搜索的代码如下(使用版本为Python3.3):

'''
线性搜索子函数
'''

import numpy as np
import random

def goldsteinsearch(f,df,d,x,alpham,rho,t):

  flag=0

  a=0
  b=alpham
  fk=f(x)
  gk=df(x)

  phi0=fk
  dphi0=np.dot(gk,d)

  alpha=b*random.uniform(0,1)

  while(flag==0):
    newfk=f(x+alpha*d)
    phi=newfk
    if(phi-phi0<=rho*alpha*dphi0):
      if(phi-phi0>=(1-rho)*alpha*dphi0):
        flag=1
      else:
        a=alpha
        b=b
        if(b<alpham):
          alpha=(a+b)/2
        else:
          alpha=t*alpha
    else:
      a=a
      b=alpha
      alpha=(a+b)/2
  return alpha

上述函数的输入参数主要包括一个多元函数f,其导数df,当前迭代点x和当前搜索方向d,返回值是根据Goldstein准则确定的搜索步长。

我们仍以Rosenbrock函数为例,即有

用Python实现最速下降法求极值的方法

于是可得函数的梯度为

用Python实现最速下降法求极值的方法

最速下降法的代码如下:

"""
最速下降法
Rosenbrock函数
函数 f(x)=100*(x(2)-x(1).^2).^2+(1-x(1)).^2
梯度 g(x)=(-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)),200*(x(2)-x(1)^2))^(T)
"""

import numpy as np
import matplotlib.pyplot as plt
import random
import linesearch
from linesearch import goldsteinsearch

def rosenbrock(x):
  return 100*(x[1]-x[0]**2)**2+(1-x[0])**2

def jacobian(x):
  return np.array([-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0]),200*(x[1]-x[0]**2)])


X1=np.arange(-1.5,1.5+0.05,0.05)
X2=np.arange(-3.5,2+0.05,0.05)
[x1,x2]=np.meshgrid(X1,X2)
f=100*(x2-x1**2)**2+(1-x1)**2; # 给定的函数
plt.contour(x1,x2,f,20) # 画出函数的20条轮廓线

def steepest(x0):

  print('初始点为:')
  print(x0,'\n')  
  imax = 20000
  W=np.zeros((2,imax))
  W[:,0] = x0
  i = 1   
  x = x0
  grad = jacobian(x)
  delta = sum(grad**2) # 初始误差


  while i<imax and delta>10**(-5):
    p = -jacobian(x)
    x0=x
    alpha = goldsteinsearch(rosenbrock,jacobian,p,x,1,0.1,2)
    x = x + alpha*p
    W[:,i] = x
    grad = jacobian(x)
    delta = sum(grad**2)
    i=i+1

  print("迭代次数为:",i)
  print("近似最优解为:")
  print(x,'\n')  
  W=W[:,0:i] # 记录迭代点
  return W

x0 = np.array([-1.2,1])
W=steepest(x0)

plt.plot(W[0,:],W[1,:],'g*',W[0,:],W[1,:]) # 画出迭代点收敛的轨迹
plt.show()

为了实现不同文件中函数的调用,我们先用import函数导入了线性搜索的子函数,也就是下面的2行代码

import linesearch
from linesearch import goldsteinsearch

当然,如果把定义goldsteinsearch函数的代码直接放到程序里面,就不需要这么麻烦了,但是那样的话,不仅会使程序显得很长,而且不便于goldsteinsearch函数的重用。

此外,Python对函数式编程也支持的很好,在定义goldsteinsearch函数时,可以允许抽象的函数f,df作为其输入参数,只要在调用时实例化就可以了。与Matlab不同的是,传递函数作为参数时,Python是不需要使用@将其变为函数句柄的。

运行结果为

初始点为:

[-1.2 1. ] 

迭代次数为: 1504

近似最优解为:

[ 1.00318532 1.00639618]

迭代点的轨迹为

用Python实现最速下降法求极值的方法

由于在线性搜索子程序中使用了随机函数,初始搜索点是随机产生的,因此每次运行的结果不太相同,比如再运行一次程序,得到

初始点为:
[-1.2 1. ] 

迭代次数为: 1994

近似最优解为:
[ 0.99735222 0.99469882]

所得图像为

用Python实现最速下降法求极值的方法

以上这篇用Python实现最速下降法求极值的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的简单文本类游戏实例
Apr 28 Python
Python中用psycopg2模块操作PostgreSQL方法
Nov 28 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
tensorflow中next_batch的具体使用
Feb 02 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
python3去掉string中的标点符号方法
Jan 22 Python
python 消费 kafka 数据教程
Dec 21 Python
python定义类self用法实例解析
Jan 22 Python
python实现最速下降法
Mar 24 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
Python中的全局变量如何理解
Jun 04 Python
Python如何给函数库增加日志功能
Aug 04 Python
python networkx 根据图的权重画图实现
Jul 10 #Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 #Python
python卸载后再次安装遇到的问题解决
Jul 10 #Python
Python求离散序列导数的示例
Jul 10 #Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 #Python
我们为什么要减少Python中循环的使用
Jul 10 #Python
详解Python中的各种转义符\n\r\t
Jul 10 #Python
You might like
如何分别全角和半角以避免乱码
2006/10/09 PHP
php简单提示框alert封装函数
2010/08/08 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
PHP pear安装配置教程
2016/05/14 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
Maps Javascript
2007/01/22 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
jquery 常用操作方法
2010/01/28 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
Python实现保证只能运行一个脚本实例
2015/06/24 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
分分钟入门python语言
2018/03/20 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
python脚本后台执行方式
2019/12/21 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
python中Django文件上传方法详解
2020/08/05 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
跟单文员岗位职责
2014/01/03 职场文书
八项规定整改方案
2014/02/21 职场文书
综合实践活动总结
2014/05/05 职场文书
项目经理任命书内容
2014/06/06 职场文书
公司感谢信范文
2015/01/22 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
民事辩护词范文
2015/05/21 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python
python lambda 表达式形式分析
2022/04/03 Python
选购到合适的激光打印机
2022/04/21 数码科技