常见优化算法实现

这里实现的主要算法有:

一维搜索方法:

黄金分割法

二次差值法

多维搜索算法

最速下降法

partan加速的最速下降法

共轭梯度法

牛顿法

拟牛顿法

使用函数表示一个用于优化的目标,包括其梯度函数和hessian矩阵函数

  1. import numpy as np
  2. import math
  1. #用于测试的一个多元函数的例子
  2. def f(x):
  3. return (x[0]-1)**2+5*(x[1]-5)**2+(x[2]-1)**2+5*(x[3]-5)**2
  4. #f(x)函数的gradient向量计算函数
  5. def g(x):
  6. return np.array([2*(x[0]-1),10*(x[1]-5),2*(x[2]-1),10*(x[3]-5)])
  7. #f(x)函数的hessian矩阵的逆矩阵计算函数
  8. def hi(x=None):
  9. h=[1/2,1/10,1/2,1/10]
  10. return np.diag(h)

拟牛顿法

  1. def quasi_newton(f=f,x0=np.zeros(4),gradient=g,acc=0.001):
  2. k=0
  3. x=x0
  4. xp=None
  5. hpk=None
  6. gpk=None
  7. while True:
  8. gk=gradient(x)
  9. #print(gk)
  10. if np.sum(gk**2)<=acc:
  11. #print("迭代 %d 次"%(k+1))
  12. return x,np.round(f(x),5)
  13. if k==0:
  14. hik=np.eye(x0.shape[0])
  15. else:
  16. dx=x-xp
  17. dg=gk-gpk
  18. temp = (dx-np.dot(hpk,dg)).reshape((-1,1))
  19. hik=hpk + np.dot(temp,temp.transpose())/(np.dot(temp.transpose(),dg.reshape((-1,1))))
  20. #print(hik)
  21. pk=-1*np.dot(hik,gk)
  22. alpha,y=quadraticInterploation(lambda alpha:(f(alpha*pk+x)),0,10,0.001)
  23. #更新变量
  24. x=alpha*pk+x
  25. hpk=hik
  26. xp=x
  27. gpk=gk
  28. k+=1

共轭方向法

  1. def conjugate_direction(f=f,x0=np.zeros(4),gradient=g,acc=0.001):
  2. k=0
  3. x=x0
  4. #设置初值
  5. gpk=x0
  6. ppk=x0
  7. while True:
  8. gk=gradient(x)
  9. #print(gk)
  10. if np.sum(gk**2)<=acc:
  11. #print("迭代 %d 次"%(k+1))
  12. return x,np.round(f(x),5)
  13. if k==0:
  14. pk=-1*gk
  15. else:
  16. betak=np.sum(gk*gk)/np.sum(gpk*gpk)
  17. pk=-1*gk+betak*ppk
  18. #lambda表达式可以使用上层函数中的变量,这样对于不同的上下文,就是不同的函数
  19. alpha,y=quadraticInterploation(lambda alpha:(f(alpha*pk+x)),0,10,0.001)
  20. x=alpha*pk+x
  21. ppk=pk
  22. gpk=gk
  23. k+=1

最速下降法

  1. #最速下降法
  2. def steepestDescent(f=f,x0=np.zeros(4),gradient=g,acc=0.001):
  3. k=0
  4. x=x0
  5. while True:
  6. gk=gradient(x)
  7. pk=-1*gk
  8. if np.sum(gk**2)<=acc:
  9. #print("迭代 %d 次"%(k+1))
  10. return x,f(x)
  11. #lambda表达式可以使用上层函数中的变量,这样对于不同的上下文,就是不同的函数
  12. alpha,y=quadraticInterploation(lambda alpha:(f(alpha*pk+x)),0,10,0.001)
  13. x=alpha*pk+x
  14. k+=1

牛顿法

  1. def newton(f=f,x0=np.zeros(4),gradient=g,hessian=hi,acc=0.001):
  2. k=0
  3. x=x0
  4. while True:
  5. gk=gradient(x)
  6. hik=hessian(x)
  7. pk=-1*np.dot(gk,hik)
  8. if np.sum(gk**2)<=acc:
  9. #print("迭代 %d 次"%(k+1))
  10. return x,f(x)
  11. #lambda表达式可以使用上层函数中的变量,这样对于不同的上下文,就是不同的函数
  12. alpha,y=quadraticInterploation(lambda alpha:(f(alpha*pk+x)),0,10,0.001)
  13. x=alpha*pk+x
  14. k+=1

使用partan加速的最速下降法

  1. def partan(f=f,x0=np.zeros(4),gradient=g,acc=0.001,N=3):
  2. k=0
  3. x=x0
  4. xp1=x0
  5. xp2=x0
  6. while True:
  7. if k>=N and k%3==0:
  8. pk=x-xp2
  9. else:
  10. gk=gradient(x)
  11. pk=-1*gk
  12. if np.sum(pk**2)<=acc:
  13. #print("迭代 %d 次"%(k+1))
  14. return x,f(x)
  15. #lambda表达式可以使用上层函数中的变量,这样对于不同的上下文,就是不同的函数
  16. alpha,y=quadraticInterploation(lambda alpha:(f(alpha*pk+x)),0,10,0.001)
  17. xp2=xp1
  18. xp1=x
  19. x=alpha*pk+x
  20. k+=1

一维搜索的黄金分割方法

  1. def goldenSegmantation(f,a,b,acc):
  2. x1=a+0.382*(b-a)
  3. x2=b-(x1-a)
  4. R=f(x1);G=f(x2)
  5. #因为浮点数的舍入误差,可能导致a,b的大小逆转
  6. while abs(b-a)>acc and a<=x1<x2<=b:
  7. #print(abs(b-a))
  8. if R>G:
  9. a=x1
  10. x1=x2
  11. R=G
  12. x2=b-(x1-a)
  13. G=f(x2)
  14. else:
  15. b=x2
  16. x2=x1
  17. G=R
  18. x1=a+(b-x2)
  19. R=f(x1)
  20. return (a+b)/2.0,f(((a+b)/2.0))

一维搜索的二次差值方法

  1. def quadraticInterploation(f,a,b,acc):
  2. assert(a<b)
  3. x1=a;x2=(a+b)/2;x3=b
  4. f1=f(x1);f2=f(x2);f3=f(x3)
  5. while True:
  6. c1=(f3-f1)/(x3-x1);c2=((f2-f1)/(x2-x1)-c1)/(x2-x3)
  7. xp=0.5*(x1+x3-c1/c2)
  8. fp=f(xp)
  9. if abs(xp-x2)<acc or not a<=x1<x2<x3<=b:
  10. if fp<f2:
  11. return xp,fp
  12. else:
  13. return x2,f2
  14. if x2<xp:
  15. if f2<fp:
  16. x3=xp;f3=fp
  17. else:
  18. x1=x2;f1=f2
  19. x2=xp;f2=fp
  20. else:
  21. if f2<fp:
  22. x1=xp;f1=fp
  23. else:
  24. x3=x2;f3=f2
  25. x2=xp;f2=fp

测试一维搜索方法

  1. %timeit(goldenSegmantation(lambda x:(x**4-5),-1,1,0.0001))
  2. %timeit(quadraticInterploation(lambda x:(x**4-5),-1,1,0.00001))
  3. %timeit(goldenSegmantation(lambda x:(x**2-5*x+6),-10,10,0.00000005))
  4. %timeit(quadraticInterploation(lambda x:(x**2-5*x+6),-10,10,0.000001))
  5. %timeit(goldenSegmantation(math.sin,-1*math.pi,0,0.000001))
  6. %timeit(quadraticInterploation(math.sin,-1*math.pi,0,0.0000001))
  1. 11.3 µs ± 58.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  2. 3.09 µs ± 18.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  3. 12.5 µs ± 47.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  4. 5.44 µs ± 27.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  5. 7.97 µs ± 33.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  6. 2.05 µs ± 19.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

结果分析

对于不同的目标函数,二次插值的速度均大于黄金分割方法

测试高维搜索方法

  1. %timeit steepestDescent()
  2. %timeit partan()
  3. %timeit conjugate_direction()
  4. %timeit newton()
  5. %timeit quasi_newton()
  1. 236 µs ± 2.39 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  2. 297 µs ± 2.39 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  3. 197 µs ± 1.49 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  4. 125 µs ± 276 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  5. 224 µs ± 1.28 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

结果分析

从结果看出来,partan加速方法相比最速下降方法并没有什么优势,主要原因是目标函数太简单,迭代次数太少

拟牛顿法相比最速下降法也没有什么优势,我想也是基于同样的原因

常见优化算法统一框架下的实现:最速下降法,partan加速的最速下降法,共轭梯度法,牛顿法,拟牛顿法,黄金分割法,二次插值法的更多相关文章

  1. 最优化算法——常见优化算法分类及总结

    之前做特征选择,实现过基于群智能算法进行最优化的搜索,看过一些群智能优化算法的论文,在此做一下总结. 在生活或者工作中存在各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题"在一定成 ...

  2. 优化深度神经网络(二)优化算法 SGD Momentum RMSprop Adam

    Coursera吴恩达<优化深度神经网络>课程笔记(2)-- 优化算法 深度机器学习中的batch的大小 深度机器学习中的batch的大小对学习效果有何影响? 1. Mini-batch ...

  3. zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    首先定义:待优化参数:  ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch  : 计算目标函数关于当前参数的梯度:  根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ...

  4. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...

  5. Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法

    机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了. 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了, ...

  6. 解析基于keras深度学习框架下yolov3的算法

    一.前言 由于前一段时间以及实现了基于keras深度学习框架下yolov3的算法,本来想趁着余热将自己的心得体会进行总结,但由于前几天有点事就没有完成计划,现在趁午休时间整理一下. 二.Keras框架 ...

  7. [Algorithm] 群体智能优化算法之粒子群优化算法

    同进化算法(见博客<[Evolutionary Algorithm] 进化算法简介>,进化算法是受生物进化机制启发而产生的一系列算法)和人工神经网络算法(Neural Networks,简 ...

  8. 深度学习必备:随机梯度下降(SGD)优化算法及可视化

    补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...

  9. 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)

    00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算法! 它的优点包括但不限于: 遗传算法对所求解的优化问题没有太多的 ...

随机推荐

  1. 张高兴的 Xamarin.Android 学习笔记:(三)活动生命周期

    本文将直接解释我写的一个示例.示例目的在于展示 Android 活动在 Xamarin 中的用法.如果有朋友对基础知识不太了解建议先学 Android . 新建一个 Xamarin.Android 项 ...

  2. 细品 - 逻辑回归(LR)

    1. LR的直观表述 1.1 直观表述 今天我们来深入了解一个人见人爱,花见花开,工业界为之疯狂,学术界..额,好像学术界用的不多哎.不过没关系,就算学术界用的不多也遮不住它NB的光芒,它就是LR模型 ...

  3. 11-05-sdust-个人赛赛后随想

    第二次打个人赛 这次居然打秃了,被A题卡的体无完肤.....结果之后转D题心里挂着A题...D题也被卡. 然后第二天不甘心,翘课来机房敲昨天的题,结果两题完全重新敲,都是10分钟左右敲完代码,A题1掉 ...

  4. 基于8211lib库对s57电子海图的解析和存储

    电子海图是为适用航海需要而绘制的包含海域地理信息和航海信息的一种数字化的专题地图,符合国际标准的电子海图数据统称为S-57电子海图.本文主要在S-57电子海图数据的理论模型和数据结构的基础上,实现对S ...

  5. 【转】认识物理I/O构件- 主机I/O总线

    在数据离开系统内存总线后,它通常传输到另一条总线,即主机I/O总线.在今天的产品中,最常见的主机I/O总线是PCI总线,但也存在着几种其他的总线,如S -总线,EIS A总线及VME总线.主机I/O总 ...

  6. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  7. JAVA基础知识总结:七

    一.面向对象编程 1.什么是面向对象? 万物皆对象 案例一:我想吃大盘鸡 面向过程 面向对象 1.我自己去买一只鸡 1.委托一个会砍价的人去帮忙买鸡 2.我自己宰鸡 2.委托一个胆大的人宰鸡 3.我自 ...

  8. JavaWeb之Eclipse中使用Maven构建SpringMVC项目

    为了学习spring和maven我这也是拼了老命了,光使用maven配置springmvc我花了上周一周的时间,下班回来就搞,一直有bug,一个bug接着一个,昨天一整天都在解决配置的问题,让大学同学 ...

  9. 数据权限设计——基于EntityFramework的数据权限设计方案:一种设计思路

    前言:“我们有一个订单列表,希望能够根据当前登陆的不同用户看到不同类型的订单数据”.“我们希望不同的用户能看到不同时间段的扫描报表数据”.“我们系统需要不同用户查看不同的生产报表列”.诸如此类,最近经 ...

  10. VPS搭建离线下载服务器——后网盘时代

    动机 由于学习的需要,在国外某服务器厂商购买了vps服务(至于是哪个厂商就不说啦).但是呢,就算用作梯子,一个月1T的流量总是用不完.最经觉得自己营养充足,想找点电影看看. 无奈现在百度网盘的速度真的 ...