Python怎么做最优化

Python怎么做最优化,第1张

一、概观scipy中的optimize子包中提供了常用的最优化算法函数实现。我们可以直接调用这些函数完成我们的优化问题。optimize中函数最典型的特点就是能够从函数名称上看出是使用了什么算法。下面optimize包中函数的概览:1.非线性最优化fmin -- 简单Nelder-Mead算法fmin_powell -- 改进型Powell法fmin_bfgs -- 拟Newton法fmin_cg -- 非线性共轭梯度法fmin_ncg -- 线性搜索Newton共轭梯度法leastsq -- 最小二乘2.有约束的多元函数问题fmin_l_bfgs_b ---使用L-BFGS-B算法fmin_tnc ---梯度信息fmin_cobyla ---线性逼近fmin_slsqp ---序列最小二乘法nnls ---解|| Ax - b ||_2 for x=03.全局优化anneal ---模拟退火算法brute --强力法4.标量函数fminboundbrentgoldenbracket5.拟合curve_fit-- 使用非线性最小二乘法拟合6.标量函数求根brentq ---classic Brent (1973)brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出这个算法的人名bisect ---二分法newton ---牛顿法fixed_point7.多维函数求根fsolve ---通用broyden1 ---Broyden’s first Jacobian approximation.broyden2 ---Broyden’s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixingexcitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.实用函数line_search ---找到满足强Wolfe的alpha值check_grad ---通过和前向有限差分逼近比较检查梯度函数的正确性二、实战非线性最优化fmin完整的调用形式是:fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不过我们最常使用的就是前两个参数。一个描述优化问题的函数以及初值。后面的那些参数我们也很容易理解。如果您能用到,请自己研究。下面研究一个最简单的问题,来感受这个函数的使用方法:f(x)=x**2-4*x+8,我们知道,这个函数的最小值是4,在x=2的时候取到。from scipy.optimize import fmin#引入优化包def myfunc(x):return x**2-4*x+8#定义函数x0 = [1.3]#猜一个初值xopt = fmin(myfunc, x0)#求解print xopt#打印结果运行之后,给出的结果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]程序准确的计算得出了最小值,不过最小值点并不是严格的2,这应该是由二进制机器编码误差造成的。除了fmin_ncg必须提供梯度信息外,其他几个函数的调用大同小异,完全类似。我们不妨做一个对比:from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):return x**2-4*x+8x0 = [1.3]xopt1 = fmin(myfunc, x0)print xopt1printxopt2 = fmin_powell(myfunc, x0)print xopt2printxopt3 = fmin_bfgs(myfunc, x0)print xopt3printxopt4 = fmin_cg(myfunc,x0)print xopt4给出的结果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 531.99999999997Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 12Gradient evaluations: 4[ 2.00000001]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 15Gradient evaluations: 5[ 2.]我们可以根据给出的消息直观的判断算法的执行情况。每一种算法数学上的问题,请自己看书学习。个人感觉,如果不是纯研究数学的工作,没必要搞清楚那些推导以及定理云云。不过,必须了解每一种算法的优劣以及能力所及。在使用的时候,不妨多种算法都使用一下,看看效果分别如何,同时,还可以互相印证算法失效的问题。在from scipy.optimize import fmin之后,就可以使用help(fmin)来查看fmin的帮助信息了。帮助信息中没有例子,但是给出了每一个参数的含义说明,这是调用函数时候的最有价值参考。有源码研究癖好的,或者当你需要改进这些已经实现的算法的时候,可能需要查看optimize中的每种算法的源代码。在这里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聪明的你肯定发现了,顺着这个链接往上一级、再往上一级,你会找到scipy的几乎所有源码!

yxhtest7772017-07-18

关注

分享

 697     2

python运行速度慢怎么办?6个Python性能优化技巧

Python是一门非常酷的语言,因为很少的Python代码可以在短时间内做很多事情,并且,Python很容易就能支持多任务和多重处理。

Python的批评者声称Python性能低效、执行缓慢,但实际上并非如此:尝试以下6个小技巧,可以加快Python应用程序。

关键代码可以依赖于扩展包

Python使许多编程任务变得简单,但是对于很关键的任务并不总是提供最好的性能。使用C、C++或者机器语言扩展包来执行关键任务能极大改善性能。这些包是依赖于平台的,也就是说,你必须使用特定的、与你使用的平台相关的包。简而言之,该解决方案提供了一些应用程序的可移植性,以换取性能,您可以获得只有通过直接向底层主机编程。

下面这些扩展包你可以考虑添加到你的个人扩展库中:

Cython

PyInlne

PyPy

Pyrex

这些包有不同的作用和执行方式。例如,Pyrex 让Python处理一些内存任务变得简单高效;PyInline可以直接让你在Python应用程序中使用C代码,虽然内联代码被单独编译,但是如果你能高效的利用C代码,它可以在同一个地方处理每一件事情。

使用关键字排序

有很多古老的Python代码在执行时将花费额外的时间去创建一个自定义的排序函数。最好的排序方式是使用关键字和默认的sort()方法。

优化循环

每一种编程语言都强调循环语句的优化,Python也是一样的。尽管你可以依赖于丰富的技术让循环运行的更快,然而,开发者经常忽略的一个方法是避免在循环内部使用点拼接字符串。

使用新版本

任何一个在线上搜索Python资料的人都会发现无数关于Python版本迁移的信息。通常,Python每一个版本都针对之前的一个版本做了优化和改进,以让Python运行的更快。限制因素是你喜欢的函数库是否也针对Python的新版本做了改进。

当你使用了新的函数库,获得了Python的新版本,你需要保证代码依然能够运行,检查应用,修正差异。然后,如果你仅仅是

函数详见rres,此代码使该算法运行了两次

收获:

这是我第一个实现的代码。学习完该算法以后,逻辑框架基本上就有了,剩下需要明确的就是对应的python的语言。于是我就开始了查找“如何定义函数”(详见mofan的优酷),“循环体”和“if条件语句”的格式(https://blog.csdn.net/qq_39407518/article/details/79822498)“数学符号”(详见mofan的优酷),以及print的使用

1.def是python中指定义,一般用来定义函数,如果需要深度学习搭建网络可用来定义网络。值得注意的一点是

我不清楚为什么,但是如果没有加的话,那个函数公式就是一个花瓶,就像一个结果输不出去。

2.最坑的就是逻辑。一开始逻辑没理清楚,或者说在代码上有疏漏,导致我将left和right放在了循环体里,结果可想而知。不过也是因为这个错误,我知道pycharm中的debug怎么用,挺简单的,百度一下就出来了。

3.不知道什么原因,看的莫烦视频中的print多个变量一起输出是没有办法在我的pycharm中使用的,出来的结果很奇怪。可能是因为我是win10不是ios吧。print如果多个变量一起输出必须是print("名字:%s,名字2:%s"%(a,b))结果输出就是名字:a ,名字2:b

关于python中数据变量。第一遍运行结果出现很明显不对,于是我采用了debug。结果发现,mid1处一直为1而不是1.5,于是就开始了解数据变量。起初我猜测python默认所有变量为整型,但是根据二分法的结果我意识到此猜测不对,所以要改整个file的变量格式没有必要。所以我就在mid1式子前面加了一个float,结果就显示为1.5了。但是如果我将整个式子用()括起来,前面加float,结果还是1。我不太理解为什么。不过我知道了python的数据格式是根据输入量决定的,也就是说你的输入量如果是整型,那么与其直接相关的计算输出结果一定是整型,而且还是不采用进位的整型。在我没有采用+float/+.0这两种方法之前,mid1~3全部是整型。

或者不再mid1前面加float,直接将输入量后面点个点就行

真的很想吐槽一下print,好麻烦啊啊啊啊每次都得弄个%s,而且有时候还不能放一起!!!!

不要问我掌握了什么,要问我现在写完这个代码后有多么的爱python的精度表示 :-)我决定以后只要再编写数学公式的代码都将输入量的小数学点后面补很多0

fibonacci函数定义,每次debug后我的手都是抖的O( _ )O~

不知道自己什么时候有的强迫症,只要是代码下面有“~”我就必须要消掉。笑哭。这个很简单,前四个除了费波纳茨,都很简单。

这个公式看起来很麻烦,便写的时候更要谨慎。我上回把那个2搁在了分号下面,结果很大,所以还是换算成0.5更好(PS:勿忘那长河般的0)。

虽然代码很长,但是主要是因为print太多。本打算在开头print,最后结果会漏掉最后一部分。懒得想其他办法了,直接就这样吧

一开始while里面写成了>,导致run不出来。继而,debug也没法用。在网上一查才知道 “没联网”+“没选断点”。最后想尝试将else里面的内容输出来,结果发现run以后被刷屏了。于是改成i<7以后还是不行,于是想着加一个break跳出循环,结果成效了。

然后刚刚由debug了一下,才知道原来是i+1在if里面,因为没有办法+1,所以i=6一直存在,就不断循环。因为加break也好,i+1也好,都可以。

这是我第一组自己实现的python代码,就是数学公式用python语言组装起来。刚开始的时候知道大概需要在语言中体现什么,但不太清楚。于是我就在网上找了几个二分法的,他们都各有不同,但框架都差不多,不过如果要用到我们的那个公式里还需要改变很多。然后我就开始分析我们的题,我发现大体需要两部分,一部分函数定义,一部分循环体。但我不知道如何定义函数,如何写数学公式,如何弄变量,也就是说一些小点不太会,所以我选择直接百度。因为我知道自己阅读的能力不错,相比于从视频中提取要素,我更擅长通过阅读获得要点。有目的性地找知识点,掌握地更牢固。

于是我就开始了第一个——二分法的编写。我发现,自己出现了很多错误而且有很多地方都很基础。但我依然没选择视频,而是将这些问题直接在百度上找,因为视频讲完或许你也没找到点。当然,这是一步一步走的,不是直接就将程序摆上去,一点一点改。

随着前两个的成功,我发现自己对于这些代码有了自信,似乎看透了他们的伪装,抓住了本质。除此之外,我还意识到自己自从8月份以后,学习能力似乎提高了不少,而且有了更为有效的学习方法。各方面都有了一定的觉醒。除了第一个找了几个牛头不对马嘴的代码,其他都是根据自己的逻辑写,逻辑通下来以后,对应语言中某一部分不知道如何翻译就去百度,其实这几个套路都一样或者说数学公式转化的套路都一样。

我还意识到,汇编其实是最难的语言,目前为止所学到的,因为很多都需要自己去定义,去死抠,需要记住大量的指令且不能灵活变通。但是其他的却只需要将一些对应的记下来就好。python真的挺简单的。而且,我发现自己今天似乎打开了新世界的大门,我爱上了这种充满了灵性的东西,充满了严谨的美丽,还有那未知的变化,我发现我似乎爱上了代码。可能不仅仅局限于python,这些语言都充满了挑战性。我觉得当你疑惑的时候,就需要相信直觉,至少我发现它很准


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/150857.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-21
下一篇2023-03-21

发表评论

登录后才能评论

评论列表(0条)

    保存