python对函数求偏导 python partial偏函数及用法( 六 )


?? 在前面的推导中,多项式的阶数被固定了,那么实际场景下应该如何选择合适的阶数MM呢?
一般会选择阶数MM小于点数NN
把训练数据分为训练集合验证集,在训练集上,同时用不同的MM值训练多个模型,然后选择在验证集误差最小的阶数script type="math/tex" id="MathJax-Element-5573"M/script
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);

推荐阅读