原理就不做过多介绍了,直接上代码。其中的一维线搜索写了三种方法(黄金分割法,Armijo线搜索,Wolfe-Powell线搜索),可以稍微对比以下。

一、黄金分割法

黄金分割法计算步骤

import numpy as npdef golden(f, x0, d, s):'''黄金分割法求最小值返回下降步长f: 需要求最小值的函数x0: x_0d: 方向 s: 步长上限'''t,e=0.618,1e-5a,b=0,sa1=a+(1-t)*(b-a)a2=a+t*(b-a)f1,f2=f(x0+a1*d),f(x0+a2*d)while abs(a-b)>=e:if f1<f2:a2,f2,b=a1,f1,a2a1=a+(1-t)*(b-a)f1=f(x0+a1*d)else:a,a1,f1=a1,a2,f2a2=a+t*(b-a)f2=f(x0+a2*d)a=(a1+a2)/2return a

二、Armijo线搜索

Armijo线搜索计算步骤

def armijo(f,df, x, d, sigma=0.1):'''Armijo非精确线搜索求最小值返回搜索步长f: 需要求最小值的函数x: x_0d: 搜索方向sigma: armijo准则中的参数'''alpha, p, k=1.0, 0.8, 1while f(x+alpha*d)>=f(x)+sigma*alpha*df(x).dot(d) and k<100:alpha *= pk += 1return alpha

三、Wolfe-Powell线搜索

Wolfe-Powell线搜索计算步骤

def wolfe_powell(f,df,x,d,sigma1=1e-3,sigma2=0.9):'''Wolfe-powell非精确线搜索求最小值返回搜索步长f: 需要求最小值的函数x: x_0d: 搜索方向sigma1, sigma2: Wolfe-powell准则中的参数'''a, b, alpha = 0, float('inf'), 1k = 0while k<1000:k += 1if f(x+alpha*d) > f(x)+sigma1*alpha*df(x).dot(d):       # 若不满足Wolfe-powell准则1,则缩小alphab = alphaalpha = (alpha + a)/2   elif df(x+alpha*d).dot(d) < sigma2*df(x).dot(d):        # 若不满足Wolfe-powell准则2,则增大alphaa = alphaalpha = min(2*alpha, (alpha+b)/2)else:                                                   # 若准则1和2均满足,则跳出循环breakreturn alpha

四、梯度下降法

梯度下降法计算步骤

def steepest_descent(f,df, x):'''最速下降法求最小值其中利用黄金分割法求步长f: 需要求最小值的函数df: 函数的导数x: 初始点'''k = 1while np.linalg.norm(df(x))>1e-5 and k<1000:d = -df(x)# 以下三种方法都是求一维线搜索的步长,根据需要任选一种,注释掉其余两行即可。#alpha = golden(f, x , d, 10)                # 黄金分割法求步长#alpha = armijo(f, df, x, d, sigma=0.1)    # armijo非精确搜索求步长alpha = wolfe_powell(f,df,x,d,sigma1=0.1,sigma2=0.9) # wolfe-powell非精确搜索求步长x = x + alpha*dk += 1return [x,f(x),k]       # 返回最小值点,函数最小值,迭代次数

五、实例以及执行结果

def testF1(x):return 4*(x[0]-2*x[1]-4)**2+(x[0]-2)**2def testDF1(x):res = np.zeros([2])res[0] = 8*(x[0]-2*x[1]-4)+2*(x[0]-2)res[1] = -16*(x[0]-2*x[1]-4)return resdef testF2(x):return (x[0]-1)**2+(2*x[1]-1)**2+(4*x[2]-1)**2+(8*x[3]-1)**2def testDF2(x):res = np.zeros([4])res[0] = 2*(x[0]-1)res[1] = 2*(2*x[1]-1)res[2] = 2*(4*x[2]-1)res[3] = 2*(8*x[3]-1)return resproblems = [{"f": testF1,"df": testDF1,"x0": np.array([1, 0])},{"f": testF2,"df": testDF2,"x0": np.array([0, 0, 0, 0])}
]for problem in problems:'''problem成员描述f: 函数f(x)df: 函数的梯度df(x)x0: 给定的初始点'''#print("测试函数在初始点的函数值为{},梯度为{}".format(problem["f"](problem["x0"]), problem["df"](problem["x0"])))
#steepest_descent1,2,3分别是用不同线搜索方法所写的梯度下降算法,详见上steepest_descent的代码块result1 = steepest_descent1(problem['f'],problem['df'],problem['x0'])result2 = steepest_descent2(problem['f'],problem['df'],problem['x0'])result3 = steepest_descent3(problem['f'],problem['df'],problem['x0'])print('利用梯度下降法及黄金分割法求得测试函数在点{}取得最小值{},迭代次数为{}'.format(result1[0], result1[1],result1[2]))print('利用梯度下降法及Armijo线搜索求得测试函数在点{}取得最小值{},迭代次数为{}'.format(result2[0], result2[1],result2[2]))print('利用梯度下降法及Wolfe-Powell线搜索求得测试函数在点{}取得最小值{},迭代次数为{}'.format(result3[0], result3[1],result3[2]),end='\n\n')

求解函数最值的几种算法,梯度下降法python实现相关推荐

  1. 智能计算作业——差分进化算法求解函数最值

    下面是智能计算作业,哎呀,你们快来抄我作业呀╭(╯^╰)╮ 问题描述: 算法理论我省略了,你们自己去百科上抄吧╭(╯^╰)╮ 求解步骤: (这个好像也是百科上的╭(╯^╰)╮我根据自己的需要改了一下) ...

  2. 差分进化算法求解函数最值问题

    差分进化算法求解函数最值问题 声明: 1.本文源代码来自书目<智能优化算法及其MATLAB实例(第3版)>,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了解算法及MATLAB ...

  3. No.002 关于Python函数返回值的三种情况

    关于Python函数返回值的三种情况,无返回值.有1个返回值,以及有多个返回值 # 本批次所有文章都是跟着马士兵的杨淑娟老师的视频教学所得,视频地址在下面: # https://www.bilibil ...

  4. [数值计算-10]:一元非线性函数求最小值 - 导数与梯度下降法Python法代码示例

    作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing 本文网址:https://blog.csdn.net/HiWangWenBing/article ...

  5. 递归与迭代 | 求斐波那契数列第n项值的四种算法

    前言: 昨儿晚上三点多睡不着,不知道胡思乱想了些啥,好不容易睡着了又做了些稀奇古怪的梦.考研还是继续,真难. 这一篇博客记录一下求斐波那契数列第n项值得几种方法,用到了递归和迭代的方法,所以首先我们来 ...

  6. <<人工智能导论>>上机--遗传算法求解函数最值

    利用遗传算法求解函数 f(x,y)=1/(x2+y2+1),x,y∈[−5,5]f(x,y)=1/(x^2+y^2+1),x,y\in[-5,5]f(x,y)=1/(x2+y2+1),x,y∈[−5, ...

  7. 拿到JS异步函数返回值的几种方式

    在我们的编码过程中,为了满足业务需求,经常需要获取JS异步函数的返回值.今天就来汇总一下拿值的几种方式. 1,通过回调函数的方式来拿返回值,这个想必大家不会陌生 function getSomethi ...

  8. 机器学习最常用的优化算法 — 梯度下降法

    1. 学习目标 每一个机器学习模型都有一个目标函数,而学习的目标,就是最小化目标函数.直观而言,当我们已经获得了一个函数,最小化该函数其实就是,在其自变量取值范围内,找到使得因变量最小的那个自变量取值 ...

  9. 求解单源最短路径的几种算法

    方法一:Dijkstra算法 #include<iostream> #include<algorithm> #include<cstring> #include&l ...

最新文章

  1. 打破欧美垄断,国防科大斩获“航天界奥林匹克”大赛首冠
  2. 『设计模式』写代码偷懒小技巧,程序开发大智慧--享元模式
  3. 使用 kube-bench 和 kube-hunter 对 Kubernetes 集群风险评估
  4. curl 请求日志_HTTP入门(一):在Bash中curl查看请求与响应
  5. 计算机网络拓扑结构说课稿,计算机网络应用基础说课稿修稿稿
  6. secucrecrt配置文件导入和保存
  7. JavaSE基础-02-接口
  8. kubernetes Ingress是什么
  9. sql top加不加括号的区别_SQL易错点大作战
  10. [OpenAirInterface实战-13] :OAI 基站配置文件详解
  11. 【教程】 如何在linux/mac下安装pascal
  12. Android在GoogleMap(百度地图)实现自定义指南针旋转与回正功能
  13. 蓝牙4.0 For IOS
  14. stm32简易示波器(标准库)
  15. PHP-简单理解递归
  16. sudo,su, -的区别
  17. mysql导入报1449_mysqldump 1449错误解决办法
  18. Win10任务管理器不显示GPU的解决方法
  19. 2021-2027全球与中国城市空中交通市场现状及未来发展趋势
  20. 《软件方法》第三章 自测题

热门文章

  1. 一文带你全方位了解与投递EI
  2. git提交Push to origin/master was rejected
  3. Web.17.EL表达式JSTL标签的使用
  4. storm是java还是python_Storm概念学习系列之什么是实时流计算?
  5. C/C++《程序设计基础(C语言)课程设计》[2023-04-20]
  6. (PTA)数据结构(作业)5、堆栈
  7. 20175212童皓桢 《Java程序设计》第六周学习总结
  8. Direct3D初始化失败的原因
  9. Excel教程:Excel中最强大的快捷键你知道吗
  10. 信息安全的 CIA 三要素