Statsmodels是Python的统计建模和计量经济学工具包,包括一些描述统计、统计模型估计和推断 。
Python怎么做最优化最优化
为什么要做最优化呢?因为在生活中,人们总是希望幸福值或其它达到一个极值,比如做生意时希望成本最小 , 收入最大,所以在很多商业情境中,都会遇到求极值的情况 。
函数求根
这里「函数的根」也称「方程的根」 , 或「函数的零点」 。
先把我们需要的包加载进来 。import numpy as npimport scipy as spimport scipy.optimize as optimport matplotlib.pyplot as plt%matplotlib inline
函数求根和最优化的关系?什么时候函数是最小值或最大值?
两个问题一起回答:最优化就是求函数的最小值或最大值 , 同时也是极值,在求一个函数最小值或最大值时 , 它所在的位置肯定是导数为 0 的位置 , 所以要求一个函数的极值,必然要先求导,使其为 0,所以函数求根就是为了得到最大值最小值 。
scipy.optimize 有什么方法可以求根?
可以用 scipy.optimize 中的 bisect 或 brentq 求根 。f = lambda x: np.cos(x) - x # 定义一个匿名函数x = np.linspace(-5, 5, 1000) # 先生成 1000 个 xy = f(x) # 对应生成 1000 个 f(x)plt.plot(x, y); # 看一下这个函数长什么样子plt.axhline(0, color='k'); # 画一根横线,位置在 y=0
opt.bisect(f, -5, 5) # 求取函数的根0.7390851332155535plt.plot(x, y)plt.axhline(0, color='k')plt.scatter([_], [0], c='r', s=100); # 这里的 [_] 表示上一个 Cell 中的结果 , 这里是 x 轴上的位置,0 是 y 上的位置
求根有两种方法,除了上面介绍的 bisect , 还有 brentq,后者比前者快很多 。%timeit opt.bisect(f, -5, 5)%timeit opt.brentq(f, -5, 5)10000 loops, best of 3: 157 s per loopThe slowest run took 11.65 times longer than the fastest. This could mean that an intermediate result is being cached.10000 loops, best of 3: 35.9 s per loop
函数求最小化
求最小值就是一个最优化问题 。求最大值时只需对函数做一个转换,比如加一个负号,或者取倒数,就可转成求最小值问题 。所以两者是同一问题 。
初始值对最优化的影响是什么?
举例来说,先定义个函数 。f = lambda x: 1-np.sin(x)/xx = np.linspace(-20., 20., 1000)y = f(x)
当初始值为 3 值 , 使用 minimize 函数找到最小值 。minimize 函数是在新版的 scipy 里,取代了以前的很多最优化函数,是个通用的接口,背后是很多方法在支撑 。x0 = 3xmin = opt.minimize(f, x0).x # x0 是起始点,起始点最好离真正的最小值点不要太远plt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300); # 起始点画出来,用圆圈表示plt.scatter(xmin, f(xmin), marker='v', s=300); # 最小值点画出来,用三角表示plt.xlim(-20, 20);
初始值为 3 时,成功找到最小值 。
现在来看看初始值为 10 时,找到的最小值点 。x0 = 10xmin = opt.minimize(f, x0).xplt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300)plt.scatter(xmin, f(xmin), marker='v', s=300)plt.xlim(-20, 20);
由上图可见,当初始值为 10 时,函数找到的是局部最小值点,可见 minimize 的默认算法对起始点的依赖性 。
那么怎么才能不管初始值在哪个位置,都能找到全局最小值点呢?
如何找到全局最优点?
可以使用 basinhopping 函数找到全局最优点,相关背后算法 , 可以看帮助文件,有提供论文的索引和出处 。
我们设初始值为 10 看是否能找到全局最小值点 。x0 = 10from scipy.optimize import basinhoppingxmin = basinhopping(f,x0,stepsize = 5).xplt.plot(x, y);plt.scatter(x0, f(x0), marker='o', s=300);plt.scatter(xmin, f(xmin), marker='v', s=300);plt.xlim(-20, 20);
当起始点在比较远的位置,依然成功找到了全局最小值点 。
推荐阅读
- 包含machadoophbase的词条
- 手机浏览器密码怎么改掉,手机浏览器的密码
- 六年级体育游戏奔跑类游戏,六年级体育锻炼游戏
- 考勤机u盘怎么下载考勤,考勤机u盘怎么下载考勤表
- vb.net操控扫描枪 vba用扫描枪录入数据
- scrapyredissetting的简单介绍
- 风景视频为什么短,好看的风景短视频十几秒的
- excel如何链接word,excel怎么链接word
- linux常用命令20条 linux常用命令详解