参数寻优问题详细解析
来源:互联网 发布:注册域名多少钱 编辑:程序博客网 时间:2024/05/18 01:46
参数寻优
参数寻优背景
参数寻优问题随处可见,举几个例子。
1. 小明假期结束回校,可以坐火车,可以坐汽车,可以坐飞机,还可以走着,小明从哪条路去学校更好呢?
2. 简单的数学,一元二次方程求根。
3. 高深的数学,七桥问题,怎么才能通过所有的桥各自一次走回七点所在的岸边。
4. 机器学习中,求代价函数在约束条件下的最优解问题。
其上四个问题,均是参数寻优问题。问题1中,小明可以通过试探法将所有的方式计算一下时间成本,经济成本,舒适程度,来选择一个性价比最合适的返校方式。问题2中,可以通过一元二次方程的求根公式直接求出解来。问题3中,七桥问题则是典型的图论问题,通过抽象为图,推理得出该题无解。问题4中,机器学习则是数值分析中方程的迭代解法。
本文目标
本文主要讲清楚梯度下降法、牛顿下降法是如何想到并引入参数寻优中的,以及他们为什么有效。
参数寻优的迭代法的基本原理
通过代价函数的形状,我们很自然地想到,如果我们从任意一个参数点出发,是否可以找到刚好是让代价下降的方向,沿着这个方向,一定能找到当前的极值点。
于是,迭代法参数寻优的基本原理有了:沿着(代价)函数下降的方向寻找参数,能够找到极值点。
梯度下降法的引入
在我们已经学过的数学知识中,导数和方向导数是能找到函数变化方向的。导数表示了曲线的斜率(倾斜度),方向导数表示了曲面沿着任意方向的斜率(倾斜度)。一维时,导数就足够了。但多维时,就需要借助方向导数了,而我们更希望能找到变化率最大的方向。因此,多维下借用方向导数变化最大的情况:梯度,梯度的方向是函数某点增长最快的方向,梯度的大小是该点的最大变化率。
三维下,推导方向导数与梯度的关系
方向导数:
方向:
梯度:
当两者方向相同时,
牛顿下降法的引入
牛顿法求解f(x)=0
在讲牛顿下降法之前,先讲一下
则得到
解得
从图中可以看出,
牛顿法具有天然的迭代性,可以不断逼近真实解。
牛顿下降法
那么牛顿下降法是如何引入的呢?求解最优解
对
令
得
牛顿下降法的几何意义
一阶导数决定的函数当前是否增减,二阶则决定这当时是否凹凸。牛顿下降法用二次曲面去拟合当前所处位置的局部曲面,下降方向上的选择不仅考虑了坡度是否足够大,而且考虑了走了这一步之后,坡度是否会变得更大。所以,牛顿下降法比梯度下降法看得更远,能更快地走到局部的最底部。
牛顿下降法的局限性
(1)收敛性对初始点的选取依赖性很大;
(2)每次迭代都要计算Hessian矩阵(二阶导数),计算量大;
(3)要求二阶可微分,计算Dk时,方程组有时非正定或者病态,无法求解Dk或者Dk不是下降方向。
阻尼牛顿法的引入
对牛顿法局限性的不同改进,导致阻尼牛顿法和拟牛顿法的出现。
针对牛顿法,有时得到的牛顿方向不是下降的情况,提出了阻尼牛顿法。上升的情况,比如
解决方法是:在新的迭代之前,找到下降方向,且是下降最大的方向。
(1)先确定最优解的所在区间[a, b]。
(2)一维搜索。在解区间[a, b]内搜索使得目标函数下降最大的点。
其中(1)可以用进退法,找到三个点,使得
一维搜索方法主要分为试探法和插值法,试探法有黄金分割法、fibonacci法、平分法、格点法等;插值法有牛顿法、抛物线法等。判断解两边值的大小关系或者求导为0。
剩下的部分就是跟牛顿下降法一样了。(具体实现看前面的博客)
拟牛顿法的引入
针对牛顿下降法hessian矩阵计算量大,需要正定矩阵的局限性,提出了拟牛顿法,拟牛顿法的核心是对Hessian矩阵的逆的估计。
根据不同的估计方法,分为DFP和BFGS。
机器学习的一个重要组成部分是如何寻找最优参数解。本文就常见寻优方法进行总结,并给出简单python2.7实现,可能文章有点长,大家耐心些。
寻找最优参数解,就是在一块参数区域上,去找到满足约束条件的那组参数。形象描述,比如代价函数是个碗状的,那我们就是去找最底部(代价最小)的那个地方的对应的参数值作为最优解。那么,如何找到那个底部的最优参数解呢,如何由一个初始值,一步一步地接近该最优解呢。寻优方法,提供了靠近最优解的方法,其中涉及到的核心点,无外乎两点:靠近最优解的方向和步幅(每步的长度)。
最优化,分为线性最优化理论和非线性最优化理论。其中线性最优化又称线性规划。目标函数和约束条件的表达是线性的,
算法原理及简单推导
最速下降法(梯度下降法)
借助梯度,找到下降最快的方向,大小为最大变化率。
梯度:是方向导数中,变化最大的那个方向导数。
梯度方向:标量场中增长最快的方向。
梯度大小:最大变化率。
更新:沿着梯度的负向,更新参数(靠近最优解)。
*********************************************
*********************************************
梯度下降法
优点:方便直观,便于理解。
缺点:下降速度慢,有时参数会震荡在最优解附近无法终止。
牛顿下降法
牛顿下降法,是通过泰勒展开到二阶,推到出参数更新公式的。
上式等价于
从而得到更新公式:
调整了参数更新的方向和大小(牛顿方向)。
*********************************************
*********************************************
牛顿下降法
优点:对于正定二次函数,迭代一次,就可以得到极小值点。下降的目的性更强。
缺点:要求二阶可微分;收敛性对初始点的选取依赖性很大;每次迭代都要计算Hessian矩阵,计算量大;计算Dk时,方程组有时奇异或者病态,无法求解Dk或者Dk不是下降方向。
阻尼牛顿法
这是对牛顿法的改进,在求新的迭代点时,以Dk作为搜索方向,进行一维搜索,求步长控制量
*********************************************
*********************************************
阻尼牛顿法
优点:修改了下降方向,使得始终朝着下降的方向迭代。
缺点:与牛顿法一样。
一维搜索方法简介
一维无约束优化问题
(1)确定最优解所在区间[a,b] (进退法)
思想:从初始点
*********************************************
*********************************************
(2)在[a, b]内,找到极小值(黄金分割法和平分法)
*********************************************
*********************************************
思考:如何在实际应用中,选择[a, b],函数
拟牛顿法 - DFP法
由于牛顿法计算二阶导数,计算量大,故此用其他方法(一阶导数)估计Hessian矩阵的逆。
两侧同时除以
令
则
且
用上式来估计Hessian的逆。设
根据H的构造函数不同,分为不同的拟牛顿方法,下面为DFP方法:
*********************************************
*********************************************
拟牛顿法DFP:
优点:减少了二阶计算,运算量大大降低。
拟牛顿法 - BFGS法
若构造函数如下,则为BFGS法。
*********************************************
*********************************************
拟牛顿法是无约束最优化方法中最有效的一类算法。
算法的Python实现代码
Python2.7需要安装pandas, numpy, scipy, matplotlib。
下面给出Windows7下exe方式按照上面模块的简单方法。
numpy–http://sourceforge.net/projects/numpy/files/ –这里面也可以找到较新的scipy –
scipy–http://download.csdn.net/detail/caanyee/8241305
pandas-https://pypi.python.org/packages/2.7/p/pandas/pandas-0.12.0.win32-py2.7.exe#md5=80b0b9b891842ef4bdf451ac07b368e5
test.py
<code class="hljs python has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># coding = utf-8</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'''time: 2015.06.03author: yujianminobjection: BGD / SGD / mini-batch GD / QNGD / DFP / BFGS 实现了批量梯度下降、单个梯度下降; 最速下降法、牛顿下降法、阻尼牛顿法、拟牛顿DFP和BFGS'''</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> pandas <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> pd<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> numpy <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> np<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> scipy <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> sp<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> matplotlib.pyplot <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> pltdata = pd.read_csv(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"C:\\Users\\yujianmin\\Desktop\\python\\arraydataR.csv"</span>)print(data.ix[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :])dataArray = np.array(data)<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'''x = dataArray[:, 0]y = dataArray[:, 1]plt.plot(x, y, 'o')plt.title('data is like this')plt.xlabel('x feature')plt.ylabel('y label')plt.show()'''</span><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_BGD</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Batch Gradient Descent :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter: H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) Gradient = (np.dot(np.transpose(y-H),x))/nRow Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient))<= eplise: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update</span> theta = theta + alpha * Gradient i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_SGD</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Stochastic Gradient Descent :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) Loop = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop <numIter: H = np.dot(x,theta) J = np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(Loop+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i <nRow: Gradient = (y[i] - np.dot(x[i], theta)) * x[i] Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) theta = theta + alpha * Gradient i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> Gradient = (np.dot(np.transpose(y-H),x))/nRow <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient))<= eplise: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ Loop = Loop + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_NGD1</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Newton Gradient Descent -- theta := theta - alpha*[f'']^(-1)*f' :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta :reference:http://www.doc88.com/p-145660070193.html :hessian = transpos(x) * x '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter: H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update</span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) Gradient = (np.dot(np.transpose(y-H),x))/nRow Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient))<=eplise: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ Hessian = np.dot(np.transpose(x), x)/nRow theta = theta + alpha * np.dot(np.linalg.inv(Hessian), Gradient) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = theta + np.dot(np.linalg.inv(Hessian), Gradient)</span> i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_NGD2</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Newton Gradient Descent -- theta := theta - [f'']^(-1)*f' :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta :reference:http://www.doc88.com/p-145660070193.html :hessian = transpos(x) * x '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter: H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update</span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) Gradient = (np.dot(np.transpose(y-H),x))/nRow Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient)) <= eplise: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ Hessian = np.dot(np.transpose(x), x)/nRow theta = theta + np.dot(np.linalg.inv(Hessian), Gradient) i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_QNGD</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Newton Gradient Descent -- theta := theta - alpha* [f'']^(-1)*f'-- alpha is search by ForwardAndBack method and huang jin fen ge :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta :reference:http://www.doc88.com/p-145660070193.html :hessian = transpos(x) * x '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter: H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update</span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) Gradient = (np.dot(np.transpose(y-H),x))/nRow Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient))<= eplise: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: Hessian = np.dot(np.transpose(x), x)/nRow Dk = - np.dot(np.linalg.inv(Hessian), Gradient) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optimal [a,b] which contain optimal alpha</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## optimal alpha lead to min{f(theta + alpha*DK)}</span> alpha0 = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> h = np.random.random(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) alpha1 = alpha0 alpha2 = alpha0 + h theta1 = theta + alpha1 * Dk theta2 = theta + alpha2 * Dk f1 = (np.sum((y-np.dot(x, theta1))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) f2 = (np.sum((y-np.dot(x, theta2))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) Loop = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> a = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> b = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop ><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">' find [a,b] loop is %d'</span> %Loop) Loop = Loop + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1 > f2: h = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*h <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: h = -h (alpha1, alpha2) = (alpha2, alpha1) (f1, f2) = (f2, f1) alpha3 = alpha2 + h theta3 = theta + alpha3 * Dk f3 = (np.sum((y-np.dot(x, theta3))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'f3 - f2 is %f'</span> %(f3-f2)) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f3 > f2: a = min(alpha1, alpha3) b = max(alpha1, alpha3) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f3 <= f2: alpha1 = alpha2 alpha2 = alpha3 f1 = f2 f2 = f3 <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optiaml alpha in [a,b] using huang jin fen ge fa </span> e = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.01</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop ><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: alpha1 = a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.382</span> * (b - a) alpha2 = a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.618</span> * (b - a) theta1 = theta + alpha1* Dk theta2 = theta + alpha2* Dk f1 = (np.sum((y-np.dot(x, theta1))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) f2 = (np.sum((y-np.dot(x, theta2))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1 > f2: a = alpha1 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1< f2: b = alpha2 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.fabs(a-b) <= e: alpha = (a+b)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'optimal alpha is %f'</span> % alpha) theta = theta + alpha * Dk i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_DFP2</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' DFP -- theta := theta + alpha * Dk --alpha is searched by huangjin method --satisfied argmin{f(theta+alpha*Dk)}## :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta :reference:http://blog.pfan.cn/miaowei/52925.html :reference:http://max.book118.com/html/2012/1025/3119007.shtm ## important ## :hessian is estimated by DFP method. '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] Hessian = np.eye(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#costJ.append(J)</span> Gradient = (np.dot(np.transpose(y-H),x))/nRow Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) Dk = - Gradient <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(np.sum(np.fabs(Dk)) <= eplise ): <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## stop condition ##</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find alpha that min f(thetaK + alpha * Dk)</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optimal [a,b] which contain optimal alpha</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## optimal alpha lead to min{f(theta + alpha*DK)}</span> alpha0 = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> h = np.random.random(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) alpha1 = alpha0 alpha2 = alpha0 + h theta1 = theta + alpha1 * Dk theta2 = theta + alpha2 * Dk f1 = (np.sum((y-np.dot(x, theta1))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) f2 = (np.sum((y-np.dot(x, theta2))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) Loop = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> a = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> b = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop ><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">' find [a,b] loop is %d'</span> %Loop) Loop = Loop + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1 > f2: h = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*h <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: h = -h (alpha1, alpha2) = (alpha2, alpha1) (f1, f2) = (f2, f1) alpha3 = alpha2 + h theta3 = theta + alpha3 * Dk f3 = (np.sum((y-np.dot(x, theta3))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'f3 - f2 is %f'</span> %(f3-f2)) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f3 > f2: a = min(alpha1, alpha3) b = max(alpha1, alpha3) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f3 <= f2: alpha1 = alpha2 alpha2 = alpha3 f1 = f2 f2 = f3 <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optiaml alpha in [a,b] using huang jin fen ge fa </span> e = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.01</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop ><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: alpha1 = a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.382</span> * (b - a) alpha2 = a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.618</span> * (b - a) theta1 = theta + alpha1* Dk theta2 = theta + alpha2* Dk f1 = (np.sum((y-np.dot(x, theta1))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) f2 = (np.sum((y-np.dot(x, theta2))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1 > f2: a = alpha1 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1< f2: b = alpha2 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.fabs(a-b) <= e: alpha = (a+b)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'optimal alpha is %f'</span> % alpha) theta_old = theta theta = theta + alpha * Dk <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update the Hessian matrix ##</span> H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update </span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># here to estimate Hessian'inv #</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sk = ThetaNew - ThetaOld = alpha * inv(H) * Gradient</span> sk = theta - theta_old <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#yk = DelX(k+1) - DelX(k)</span> DelXK = - (np.dot(np.transpose(y-np.dot(x, theta)),x))/nRow DelXk = - (np.dot(np.transpose(y-np.dot(x, theta_old)),x))/nRow yk = (DelXK - DelXk).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z1 = (sk * sk') # a matrix</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z2 = (sk' * yk) # a value</span> z1 = sk * np.transpose(sk) z2 = np.dot(np.transpose(sk),yk) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z3 = (H * yk * yk' * H) # a matrix</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z4 = (yk' * H * yk) # a value</span> z3 = np.dot(np.dot(np.dot(Hessian, yk), np.transpose(yk)), Hessian) z4 = np.dot(np.dot(np.transpose(yk), Hessian),yk) DHessian = z1/z2 - z3/z4 Hessian = Hessian + DHessian Dk = - np.dot(Hessian, DelXK.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)) i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_DFP1</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' DFP -- theta := theta + alpha * Dk alpha is fixed ## :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta :reference:http://blog.pfan.cn/miaowei/52925.html :reference:http://max.book118.com/html/2012/1025/3119007.shtm ## important ## :hessian is estimated by DFP method. '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] Hessian = np.eye(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#costJ.append(J)</span> Gradient = (np.dot(np.transpose(y-H),x))/nRow Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) Dk = - Gradient <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(np.sum(np.fabs(Dk)) <= eplise ): <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## stop condition ##</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find alpha that min f(thetaK + alpha * Dk)</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## here for simple alpha is parameter 'alpha'</span> alpha = alpha theta_old = theta theta = theta + alpha * Dk <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update the Hessian matrix ##</span> H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update </span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># here to estimate Hessian'inv #</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sk = ThetaNew - ThetaOld = alpha * inv(H) * Gradient</span> sk = theta - theta_old <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#yk = DelX(k+1) - DelX(k)</span> DelXK = - (np.dot(np.transpose(y-np.dot(x, theta)),x))/nRow DelXk = - (np.dot(np.transpose(y-np.dot(x, theta_old)),x))/nRow yk = (DelXK - DelXk).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z1 = (sk * sk') # a matrix</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z2 = (sk' * yk) # a value</span> z1 = sk * np.transpose(sk) z2 = np.dot(np.transpose(sk),yk) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z3 = (H * yk * yk' * H) # a matrix</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z4 = (yk' * H * yk) # a value</span> z3 = np.dot(np.dot(np.dot(Hessian, yk), np.transpose(yk)), Hessian) z4 = np.dot(np.dot(np.transpose(yk), Hessian),yk) DHessian = z1/z2 - z3/z4 Hessian = Hessian + DHessian Dk = - np.dot(Hessian, DelXK.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)) i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_BFGS1</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' BFGS :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta :reference:http://blog.pfan.cn/miaowei/52925.html :reference:http://max.book118.com/html/2012/1025/3119007.shtm ## important ## :hessian is estimated by BFGS method. '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] Hessian = np.eye(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#costJ.append(J)</span> Gradient = (np.dot(np.transpose(y-H),x))/nRow Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) Dk = - Gradient <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(np.sum(np.fabs(Dk)) <= eplise ): <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## stop condition ##</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find alpha that min J(thetaK + alpha * Dk)</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## here for simple alpha is parameter 'alpha'</span> alpha = alpha theta_old = theta theta = theta + alpha * Dk <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update the Hessian matrix ##</span> H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update </span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># here to estimate Hessian #</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sk = ThetaNew - ThetaOld = alpha * inv(H) * Gradient</span> sk = theta - theta_old <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#yk = DelX(k+1) - DelX(k)</span> DelXK = - (np.dot(np.transpose(y-np.dot(x, theta)),x))/nRow DelXk = - (np.dot(np.transpose(y-np.dot(x, theta_old)),x))/nRow yk = (DelXK - DelXk).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z1 = yk' * H * yk # a value</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z2 = (sk' * yk) # a value</span> z1 = np.dot(np.dot(np.transpose(yk), Hessian), yk) z2 = np.dot(np.transpose(sk),yk) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z3 = sk * sk' # a matrix</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z4 = sk * yk' * H # a matrix</span> z3 = np.dot(sk, np.transpose(sk)) z4 = np.dot(np.dot(sk, np.transpose(yk)), Hessian) DHessian = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>+z1/z2) * (z3/z2) - z4/z2 Hessian = Hessian + DHessian Dk = - np.dot(Hessian, DelXK.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)) i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_BFGS2</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' BFGS :type data: array :param data: contain x and y(label) :type step: int/float numeric :param step: length of step when update the theta :reference:http://blog.pfan.cn/miaowei/52925.html :reference:http://max.book118.com/html/2012/1025/3119007.shtm ## important ## :hessian is estimated by BFGS method. '''</span> nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow x = data[:, :nCol] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :] z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) x = np.hstack((z, x)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span> y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span> theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> costJ = [] Hessian = np.eye(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#costJ.append(J)</span> Gradient = (np.dot(np.transpose(y-H),x))/nRow Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) Dk = - Gradient <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(np.sum(np.fabs(Dk)) <= eplise ): <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## stop condition ##</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find alpha that min J(thetaK + alpha * Dk)</span> alpha = alpha <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optimal [a,b] which contain optimal alpha</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## optimal alpha lead to min{f(theta + alpha*DK)}</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' alpha0 = 0 h = np.random.random(1) alpha1 = alpha0 alpha2 = alpha0 + h theta1 = theta + alpha1 * Dk theta2 = theta + alpha2 * Dk f1 = (np.sum((y-np.dot(x, theta1))**2))/(2*nRow) f2 = (np.sum((y-np.dot(x, theta2))**2))/(2*nRow) Loop = 1 a = 0 b = 0 while Loop >0: print(' find [a,b] loop is %d' %Loop) Loop = Loop + 1 if f1 > f2: h = 2*h else: h = -h (alpha1, alpha2) = (alpha2, alpha1) (f1, f2) = (f2, f1) alpha3 = alpha2 + h theta3 = theta + alpha3 * Dk f3 = (np.sum((y-np.dot(x, theta3))**2))/(2*nRow) print('f3 - f2 is %f' %(f3-f2)) if f3 > f2: a = min(alpha1, alpha3) b = max(alpha1, alpha3) break if f3 <= f2: alpha1 = alpha2 alpha2 = alpha3 f1 = f2 f2 = f3 ## find optiaml alpha in [a,b] using huang jin fen ge fa e = 0.01 while Loop >0: alpha1 = a + 0.382 * (b - a) alpha2 = a + 0.618 * (b - a) theta1 = theta + alpha1* Dk theta2 = theta + alpha2* Dk f1 = (np.sum((y-np.dot(x, theta1))**2))/(2*nRow) f2 = (np.sum((y-np.dot(x, theta2))**2))/(2*nRow) if f1 > f2: a = alpha1 if f1< f2: b = alpha2 if np.fabs(a-b) <= e: alpha = (a+b)/2 break print('optimal alpha is %f' % alpha) '''</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## Get Dk and update Hessian</span> theta_old = theta theta = theta + alpha * Dk <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update the Hessian matrix ##</span> H = np.dot(x,theta) J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update </span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J)) costJ.append(J) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># here to estimate Hessian #</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sk = ThetaNew - ThetaOld = alpha * inv(H) * Gradient</span> sk = theta - theta_old <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#yk = DelX(k+1) - DelX(k)</span> DelXK = - (np.dot(np.transpose(y-np.dot(x, theta)),x))/nRow DelXk = - (np.dot(np.transpose(y-np.dot(x, theta_old)),x))/nRow yk = (DelXK - DelXk).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z1 = yk' * H * yk # a value</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z2 = (sk' * yk) # a value</span> z1 = np.dot(np.dot(np.transpose(yk), Hessian), yk) z2 = np.dot(np.transpose(sk),yk) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z3 = sk * sk' # a matrix</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z4 = sk * yk' * H # a matrix</span> z3 = np.dot(sk, np.transpose(sk)) z4 = np.dot(np.dot(sk, np.transpose(yk)), Hessian) DHessian = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>+z1/z2) * (z3/z2) - z4/z2 Hessian = Hessian + DHessian Dk = - np.dot(Hessian, DelXK.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)) i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## test ##</span>num = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10000</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_BGD(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_SGD(dataArray, alpha=0.00005, numIter=num, eplise=0.4)</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_NGD1(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is fixed ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_NGD2(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is 1 ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_QNGD(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is searched ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_DFP1(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is fixed ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_DFP2(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is searched ##</span>theta, costJ = Myfunction_BFGS1(dataArray, alpha=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0005</span>, numIter=num, eplise=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.4</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## alpha is fxied ##</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> thetaklen = len(costJ)leng = np.linspace(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, klen, klen)plt.plot(leng, costJ)plt.show()</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li><li style="box-sizing: border-box; padding: 0px 5px;">151</li><li style="box-sizing: border-box; padding: 0px 5px;">152</li><li style="box-sizing: border-box; padding: 0px 5px;">153</li><li style="box-sizing: border-box; padding: 0px 5px;">154</li><li style="box-sizing: border-box; padding: 0px 5px;">155</li><li style="box-sizing: border-box; padding: 0px 5px;">156</li><li style="box-sizing: border-box; padding: 0px 5px;">157</li><li style="box-sizing: border-box; padding: 0px 5px;">158</li><li style="box-sizing: border-box; padding: 0px 5px;">159</li><li style="box-sizing: border-box; padding: 0px 5px;">160</li><li style="box-sizing: border-box; padding: 0px 5px;">161</li><li style="box-sizing: border-box; padding: 0px 5px;">162</li><li style="box-sizing: border-box; padding: 0px 5px;">163</li><li style="box-sizing: border-box; padding: 0px 5px;">164</li><li style="box-sizing: border-box; padding: 0px 5px;">165</li><li style="box-sizing: border-box; padding: 0px 5px;">166</li><li style="box-sizing: border-box; padding: 0px 5px;">167</li><li style="box-sizing: border-box; padding: 0px 5px;">168</li><li style="box-sizing: border-box; padding: 0px 5px;">169</li><li style="box-sizing: border-box; padding: 0px 5px;">170</li><li style="box-sizing: border-box; padding: 0px 5px;">171</li><li style="box-sizing: border-box; padding: 0px 5px;">172</li><li style="box-sizing: border-box; padding: 0px 5px;">173</li><li style="box-sizing: border-box; padding: 0px 5px;">174</li><li style="box-sizing: border-box; padding: 0px 5px;">175</li><li style="box-sizing: border-box; padding: 0px 5px;">176</li><li style="box-sizing: border-box; padding: 0px 5px;">177</li><li style="box-sizing: border-box; padding: 0px 5px;">178</li><li style="box-sizing: border-box; padding: 0px 5px;">179</li><li style="box-sizing: border-box; padding: 0px 5px;">180</li><li style="box-sizing: border-box; padding: 0px 5px;">181</li><li style="box-sizing: border-box; padding: 0px 5px;">182</li><li style="box-sizing: border-box; padding: 0px 5px;">183</li><li style="box-sizing: border-box; padding: 0px 5px;">184</li><li style="box-sizing: border-box; padding: 0px 5px;">185</li><li style="box-sizing: border-box; padding: 0px 5px;">186</li><li style="box-sizing: border-box; padding: 0px 5px;">187</li><li style="box-sizing: border-box; padding: 0px 5px;">188</li><li style="box-sizing: border-box; padding: 0px 5px;">189</li><li style="box-sizing: border-box; padding: 0px 5px;">190</li><li style="box-sizing: border-box; padding: 0px 5px;">191</li><li style="box-sizing: border-box; padding: 0px 5px;">192</li><li style="box-sizing: border-box; padding: 0px 5px;">193</li><li style="box-sizing: border-box; padding: 0px 5px;">194</li><li style="box-sizing: border-box; padding: 0px 5px;">195</li><li style="box-sizing: border-box; padding: 0px 5px;">196</li><li style="box-sizing: border-box; padding: 0px 5px;">197</li><li style="box-sizing: border-box; padding: 0px 5px;">198</li><li style="box-sizing: border-box; padding: 0px 5px;">199</li><li style="box-sizing: border-box; padding: 0px 5px;">200</li><li style="box-sizing: border-box; padding: 0px 5px;">201</li><li style="box-sizing: border-box; padding: 0px 5px;">202</li><li style="box-sizing: border-box; padding: 0px 5px;">203</li><li style="box-sizing: border-box; padding: 0px 5px;">204</li><li style="box-sizing: border-box; padding: 0px 5px;">205</li><li style="box-sizing: border-box; padding: 0px 5px;">206</li><li style="box-sizing: border-box; padding: 0px 5px;">207</li><li style="box-sizing: border-box; padding: 0px 5px;">208</li><li style="box-sizing: border-box; padding: 0px 5px;">209</li><li style="box-sizing: border-box; padding: 0px 5px;">210</li><li style="box-sizing: border-box; padding: 0px 5px;">211</li><li style="box-sizing: border-box; padding: 0px 5px;">212</li><li style="box-sizing: border-box; padding: 0px 5px;">213</li><li style="box-sizing: border-box; padding: 0px 5px;">214</li><li style="box-sizing: border-box; padding: 0px 5px;">215</li><li style="box-sizing: border-box; padding: 0px 5px;">216</li><li style="box-sizing: border-box; padding: 0px 5px;">217</li><li style="box-sizing: border-box; padding: 0px 5px;">218</li><li style="box-sizing: border-box; padding: 0px 5px;">219</li><li style="box-sizing: border-box; padding: 0px 5px;">220</li><li style="box-sizing: border-box; padding: 0px 5px;">221</li><li style="box-sizing: border-box; padding: 0px 5px;">222</li><li style="box-sizing: border-box; padding: 0px 5px;">223</li><li style="box-sizing: border-box; padding: 0px 5px;">224</li><li style="box-sizing: border-box; padding: 0px 5px;">225</li><li style="box-sizing: border-box; padding: 0px 5px;">226</li><li style="box-sizing: border-box; padding: 0px 5px;">227</li><li style="box-sizing: border-box; padding: 0px 5px;">228</li><li style="box-sizing: border-box; padding: 0px 5px;">229</li><li style="box-sizing: border-box; padding: 0px 5px;">230</li><li style="box-sizing: border-box; padding: 0px 5px;">231</li><li style="box-sizing: border-box; padding: 0px 5px;">232</li><li style="box-sizing: border-box; padding: 0px 5px;">233</li><li style="box-sizing: border-box; padding: 0px 5px;">234</li><li style="box-sizing: border-box; padding: 0px 5px;">235</li><li style="box-sizing: border-box; padding: 0px 5px;">236</li><li style="box-sizing: border-box; padding: 0px 5px;">237</li><li style="box-sizing: border-box; padding: 0px 5px;">238</li><li style="box-sizing: border-box; padding: 0px 5px;">239</li><li style="box-sizing: border-box; padding: 0px 5px;">240</li><li style="box-sizing: border-box; padding: 0px 5px;">241</li><li style="box-sizing: border-box; padding: 0px 5px;">242</li><li style="box-sizing: border-box; padding: 0px 5px;">243</li><li style="box-sizing: border-box; padding: 0px 5px;">244</li><li style="box-sizing: border-box; padding: 0px 5px;">245</li><li style="box-sizing: border-box; padding: 0px 5px;">246</li><li style="box-sizing: border-box; padding: 0px 5px;">247</li><li style="box-sizing: border-box; padding: 0px 5px;">248</li><li style="box-sizing: border-box; padding: 0px 5px;">249</li><li style="box-sizing: border-box; padding: 0px 5px;">250</li><li style="box-sizing: border-box; padding: 0px 5px;">251</li><li style="box-sizing: border-box; padding: 0px 5px;">252</li><li style="box-sizing: border-box; padding: 0px 5px;">253</li><li style="box-sizing: border-box; padding: 0px 5px;">254</li><li style="box-sizing: border-box; padding: 0px 5px;">255</li><li style="box-sizing: border-box; padding: 0px 5px;">256</li><li style="box-sizing: border-box; padding: 0px 5px;">257</li><li style="box-sizing: border-box; padding: 0px 5px;">258</li><li style="box-sizing: border-box; padding: 0px 5px;">259</li><li style="box-sizing: border-box; padding: 0px 5px;">260</li><li style="box-sizing: border-box; padding: 0px 5px;">261</li><li style="box-sizing: border-box; padding: 0px 5px;">262</li><li style="box-sizing: border-box; padding: 0px 5px;">263</li><li style="box-sizing: border-box; padding: 0px 5px;">264</li><li style="box-sizing: border-box; padding: 0px 5px;">265</li><li style="box-sizing: border-box; padding: 0px 5px;">266</li><li style="box-sizing: border-box; padding: 0px 5px;">267</li><li style="box-sizing: border-box; padding: 0px 5px;">268</li><li style="box-sizing: border-box; padding: 0px 5px;">269</li><li style="box-sizing: border-box; padding: 0px 5px;">270</li><li style="box-sizing: border-box; padding: 0px 5px;">271</li><li style="box-sizing: border-box; padding: 0px 5px;">272</li><li style="box-sizing: border-box; padding: 0px 5px;">273</li><li style="box-sizing: border-box; padding: 0px 5px;">274</li><li style="box-sizing: border-box; padding: 0px 5px;">275</li><li style="box-sizing: border-box; padding: 0px 5px;">276</li><li style="box-sizing: border-box; padding: 0px 5px;">277</li><li style="box-sizing: border-box; padding: 0px 5px;">278</li><li style="box-sizing: border-box; padding: 0px 5px;">279</li><li style="box-sizing: border-box; padding: 0px 5px;">280</li><li style="box-sizing: border-box; padding: 0px 5px;">281</li><li style="box-sizing: border-box; padding: 0px 5px;">282</li><li style="box-sizing: border-box; padding: 0px 5px;">283</li><li style="box-sizing: border-box; padding: 0px 5px;">284</li><li style="box-sizing: border-box; padding: 0px 5px;">285</li><li style="box-sizing: border-box; padding: 0px 5px;">286</li><li style="box-sizing: border-box; padding: 0px 5px;">287</li><li style="box-sizing: border-box; padding: 0px 5px;">288</li><li style="box-sizing: border-box; padding: 0px 5px;">289</li><li style="box-sizing: border-box; padding: 0px 5px;">290</li><li style="box-sizing: border-box; padding: 0px 5px;">291</li><li style="box-sizing: border-box; padding: 0px 5px;">292</li><li style="box-sizing: border-box; padding: 0px 5px;">293</li><li style="box-sizing: border-box; padding: 0px 5px;">294</li><li style="box-sizing: border-box; padding: 0px 5px;">295</li><li style="box-sizing: border-box; padding: 0px 5px;">296</li><li style="box-sizing: border-box; padding: 0px 5px;">297</li><li style="box-sizing: border-box; padding: 0px 5px;">298</li><li style="box-sizing: border-box; padding: 0px 5px;">299</li><li style="box-sizing: border-box; padding: 0px 5px;">300</li><li style="box-sizing: border-box; padding: 0px 5px;">301</li><li style="box-sizing: border-box; padding: 0px 5px;">302</li><li style="box-sizing: border-box; padding: 0px 5px;">303</li><li style="box-sizing: border-box; padding: 0px 5px;">304</li><li style="box-sizing: border-box; padding: 0px 5px;">305</li><li style="box-sizing: border-box; padding: 0px 5px;">306</li><li style="box-sizing: border-box; padding: 0px 5px;">307</li><li style="box-sizing: border-box; padding: 0px 5px;">308</li><li style="box-sizing: border-box; padding: 0px 5px;">309</li><li style="box-sizing: border-box; padding: 0px 5px;">310</li><li style="box-sizing: border-box; padding: 0px 5px;">311</li><li style="box-sizing: border-box; padding: 0px 5px;">312</li><li style="box-sizing: border-box; padding: 0px 5px;">313</li><li style="box-sizing: border-box; padding: 0px 5px;">314</li><li style="box-sizing: border-box; padding: 0px 5px;">315</li><li style="box-sizing: border-box; padding: 0px 5px;">316</li><li style="box-sizing: border-box; padding: 0px 5px;">317</li><li style="box-sizing: border-box; padding: 0px 5px;">318</li><li style="box-sizing: border-box; padding: 0px 5px;">319</li><li style="box-sizing: border-box; padding: 0px 5px;">320</li><li style="box-sizing: border-box; padding: 0px 5px;">321</li><li style="box-sizing: border-box; padding: 0px 5px;">322</li><li style="box-sizing: border-box; padding: 0px 5px;">323</li><li style="box-sizing: border-box; padding: 0px 5px;">324</li><li style="box-sizing: border-box; padding: 0px 5px;">325</li><li style="box-sizing: border-box; padding: 0px 5px;">326</li><li style="box-sizing: border-box; padding: 0px 5px;">327</li><li style="box-sizing: border-box; padding: 0px 5px;">328</li><li style="box-sizing: border-box; padding: 0px 5px;">329</li><li style="box-sizing: border-box; padding: 0px 5px;">330</li><li style="box-sizing: border-box; padding: 0px 5px;">331</li><li style="box-sizing: border-box; padding: 0px 5px;">332</li><li style="box-sizing: border-box; padding: 0px 5px;">333</li><li style="box-sizing: border-box; padding: 0px 5px;">334</li><li style="box-sizing: border-box; padding: 0px 5px;">335</li><li style="box-sizing: border-box; padding: 0px 5px;">336</li><li style="box-sizing: border-box; padding: 0px 5px;">337</li><li style="box-sizing: border-box; padding: 0px 5px;">338</li><li style="box-sizing: border-box; padding: 0px 5px;">339</li><li style="box-sizing: border-box; padding: 0px 5px;">340</li><li style="box-sizing: border-box; padding: 0px 5px;">341</li><li style="box-sizing: border-box; padding: 0px 5px;">342</li><li style="box-sizing: border-box; padding: 0px 5px;">343</li><li style="box-sizing: border-box; padding: 0px 5px;">344</li><li style="box-sizing: border-box; padding: 0px 5px;">345</li><li style="box-sizing: border-box; padding: 0px 5px;">346</li><li style="box-sizing: border-box; padding: 0px 5px;">347</li><li style="box-sizing: border-box; padding: 0px 5px;">348</li><li style="box-sizing: border-box; padding: 0px 5px;">349</li><li style="box-sizing: border-box; padding: 0px 5px;">350</li><li style="box-sizing: border-box; padding: 0px 5px;">351</li><li style="box-sizing: border-box; padding: 0px 5px;">352</li><li style="box-sizing: border-box; padding: 0px 5px;">353</li><li style="box-sizing: border-box; padding: 0px 5px;">354</li><li style="box-sizing: border-box; padding: 0px 5px;">355</li><li style="box-sizing: border-box; padding: 0px 5px;">356</li><li style="box-sizing: border-box; padding: 0px 5px;">357</li><li style="box-sizing: border-box; padding: 0px 5px;">358</li><li style="box-sizing: border-box; padding: 0px 5px;">359</li><li style="box-sizing: border-box; padding: 0px 5px;">360</li><li style="box-sizing: border-box; padding: 0px 5px;">361</li><li style="box-sizing: border-box; padding: 0px 5px;">362</li><li style="box-sizing: border-box; padding: 0px 5px;">363</li><li style="box-sizing: border-box; padding: 0px 5px;">364</li><li style="box-sizing: border-box; padding: 0px 5px;">365</li><li style="box-sizing: border-box; padding: 0px 5px;">366</li><li style="box-sizing: border-box; padding: 0px 5px;">367</li><li style="box-sizing: border-box; padding: 0px 5px;">368</li><li style="box-sizing: border-box; padding: 0px 5px;">369</li><li style="box-sizing: border-box; padding: 0px 5px;">370</li><li style="box-sizing: border-box; padding: 0px 5px;">371</li><li style="box-sizing: border-box; padding: 0px 5px;">372</li><li style="box-sizing: border-box; padding: 0px 5px;">373</li><li style="box-sizing: border-box; padding: 0px 5px;">374</li><li style="box-sizing: border-box; padding: 0px 5px;">375</li><li style="box-sizing: border-box; padding: 0px 5px;">376</li><li style="box-sizing: border-box; padding: 0px 5px;">377</li><li style="box-sizing: border-box; padding: 0px 5px;">378</li><li style="box-sizing: border-box; padding: 0px 5px;">379</li><li style="box-sizing: border-box; padding: 0px 5px;">380</li><li style="box-sizing: border-box; padding: 0px 5px;">381</li><li style="box-sizing: border-box; padding: 0px 5px;">382</li><li style="box-sizing: border-box; padding: 0px 5px;">383</li><li style="box-sizing: border-box; padding: 0px 5px;">384</li><li style="box-sizing: border-box; padding: 0px 5px;">385</li><li style="box-sizing: border-box; padding: 0px 5px;">386</li><li style="box-sizing: border-box; padding: 0px 5px;">387</li><li style="box-sizing: border-box; padding: 0px 5px;">388</li><li style="box-sizing: border-box; padding: 0px 5px;">389</li><li style="box-sizing: border-box; padding: 0px 5px;">390</li><li style="box-sizing: border-box; padding: 0px 5px;">391</li><li style="box-sizing: border-box; padding: 0px 5px;">392</li><li style="box-sizing: border-box; padding: 0px 5px;">393</li><li style="box-sizing: border-box; padding: 0px 5px;">394</li><li style="box-sizing: border-box; padding: 0px 5px;">395</li><li style="box-sizing: border-box; padding: 0px 5px;">396</li><li style="box-sizing: border-box; padding: 0px 5px;">397</li><li style="box-sizing: border-box; padding: 0px 5px;">398</li><li style="box-sizing: border-box; padding: 0px 5px;">399</li><li style="box-sizing: border-box; padding: 0px 5px;">400</li><li style="box-sizing: border-box; padding: 0px 5px;">401</li><li style="box-sizing: border-box; padding: 0px 5px;">402</li><li style="box-sizing: border-box; padding: 0px 5px;">403</li><li style="box-sizing: border-box; padding: 0px 5px;">404</li><li style="box-sizing: border-box; padding: 0px 5px;">405</li><li style="box-sizing: border-box; padding: 0px 5px;">406</li><li style="box-sizing: border-box; padding: 0px 5px;">407</li><li style="box-sizing: border-box; padding: 0px 5px;">408</li><li style="box-sizing: border-box; padding: 0px 5px;">409</li><li style="box-sizing: border-box; padding: 0px 5px;">410</li><li style="box-sizing: border-box; padding: 0px 5px;">411</li><li style="box-sizing: border-box; padding: 0px 5px;">412</li><li style="box-sizing: border-box; padding: 0px 5px;">413</li><li style="box-sizing: border-box; padding: 0px 5px;">414</li><li style="box-sizing: border-box; padding: 0px 5px;">415</li><li style="box-sizing: border-box; padding: 0px 5px;">416</li><li style="box-sizing: border-box; padding: 0px 5px;">417</li><li style="box-sizing: border-box; padding: 0px 5px;">418</li><li style="box-sizing: border-box; padding: 0px 5px;">419</li><li style="box-sizing: border-box; padding: 0px 5px;">420</li><li style="box-sizing: border-box; padding: 0px 5px;">421</li><li style="box-sizing: border-box; padding: 0px 5px;">422</li><li style="box-sizing: border-box; padding: 0px 5px;">423</li><li style="box-sizing: border-box; padding: 0px 5px;">424</li><li style="box-sizing: border-box; padding: 0px 5px;">425</li><li style="box-sizing: border-box; padding: 0px 5px;">426</li><li style="box-sizing: border-box; padding: 0px 5px;">427</li><li style="box-sizing: border-box; padding: 0px 5px;">428</li><li style="box-sizing: border-box; padding: 0px 5px;">429</li><li style="box-sizing: border-box; padding: 0px 5px;">430</li><li style="box-sizing: border-box; padding: 0px 5px;">431</li><li style="box-sizing: border-box; padding: 0px 5px;">432</li><li style="box-sizing: border-box; padding: 0px 5px;">433</li><li style="box-sizing: border-box; padding: 0px 5px;">434</li><li style="box-sizing: border-box; padding: 0px 5px;">435</li><li style="box-sizing: border-box; padding: 0px 5px;">436</li><li style="box-sizing: border-box; padding: 0px 5px;">437</li><li style="box-sizing: border-box; padding: 0px 5px;">438</li><li style="box-sizing: border-box; padding: 0px 5px;">439</li><li style="box-sizing: border-box; padding: 0px 5px;">440</li><li style="box-sizing: border-box; padding: 0px 5px;">441</li><li style="box-sizing: border-box; padding: 0px 5px;">442</li><li style="box-sizing: border-box; padding: 0px 5px;">443</li><li style="box-sizing: border-box; padding: 0px 5px;">444</li><li style="box-sizing: border-box; padding: 0px 5px;">445</li><li style="box-sizing: border-box; padding: 0px 5px;">446</li><li style="box-sizing: border-box; padding: 0px 5px;">447</li><li style="box-sizing: border-box; padding: 0px 5px;">448</li><li style="box-sizing: border-box; padding: 0px 5px;">449</li><li style="box-sizing: border-box; padding: 0px 5px;">450</li><li style="box-sizing: border-box; padding: 0px 5px;">451</li><li style="box-sizing: border-box; padding: 0px 5px;">452</li><li style="box-sizing: border-box; padding: 0px 5px;">453</li><li style="box-sizing: border-box; padding: 0px 5px;">454</li><li style="box-sizing: border-box; padding: 0px 5px;">455</li><li style="box-sizing: border-box; padding: 0px 5px;">456</li><li style="box-sizing: border-box; padding: 0px 5px;">457</li><li style="box-sizing: border-box; padding: 0px 5px;">458</li><li style="box-sizing: border-box; padding: 0px 5px;">459</li><li style="box-sizing: border-box; padding: 0px 5px;">460</li><li style="box-sizing: border-box; padding: 0px 5px;">461</li><li style="box-sizing: border-box; padding: 0px 5px;">462</li><li style="box-sizing: border-box; padding: 0px 5px;">463</li><li style="box-sizing: border-box; padding: 0px 5px;">464</li><li style="box-sizing: border-box; padding: 0px 5px;">465</li><li style="box-sizing: border-box; padding: 0px 5px;">466</li><li style="box-sizing: border-box; padding: 0px 5px;">467</li><li style="box-sizing: border-box; padding: 0px 5px;">468</li><li style="box-sizing: border-box; padding: 0px 5px;">469</li><li style="box-sizing: border-box; padding: 0px 5px;">470</li><li style="box-sizing: border-box; padding: 0px 5px;">471</li><li style="box-sizing: border-box; padding: 0px 5px;">472</li><li style="box-sizing: border-box; padding: 0px 5px;">473</li><li style="box-sizing: border-box; padding: 0px 5px;">474</li><li style="box-sizing: border-box; padding: 0px 5px;">475</li><li style="box-sizing: border-box; padding: 0px 5px;">476</li><li style="box-sizing: border-box; padding: 0px 5px;">477</li><li style="box-sizing: border-box; padding: 0px 5px;">478</li><li style="box-sizing: border-box; padding: 0px 5px;">479</li><li style="box-sizing: border-box; padding: 0px 5px;">480</li><li style="box-sizing: border-box; padding: 0px 5px;">481</li><li style="box-sizing: border-box; padding: 0px 5px;">482</li><li style="box-sizing: border-box; padding: 0px 5px;">483</li><li style="box-sizing: border-box; padding: 0px 5px;">484</li><li style="box-sizing: border-box; padding: 0px 5px;">485</li><li style="box-sizing: border-box; padding: 0px 5px;">486</li><li style="box-sizing: border-box; padding: 0px 5px;">487</li><li style="box-sizing: border-box; padding: 0px 5px;">488</li><li style="box-sizing: border-box; padding: 0px 5px;">489</li><li style="box-sizing: border-box; padding: 0px 5px;">490</li><li style="box-sizing: border-box; padding: 0px 5px;">491</li><li style="box-sizing: border-box; padding: 0px 5px;">492</li><li style="box-sizing: border-box; padding: 0px 5px;">493</li><li style="box-sizing: border-box; padding: 0px 5px;">494</li><li style="box-sizing: border-box; padding: 0px 5px;">495</li><li style="box-sizing: border-box; padding: 0px 5px;">496</li><li style="box-sizing: border-box; padding: 0px 5px;">497</li><li style="box-sizing: border-box; padding: 0px 5px;">498</li><li style="box-sizing: border-box; padding: 0px 5px;">499</li><li style="box-sizing: border-box; padding: 0px 5px;">500</li><li style="box-sizing: border-box; padding: 0px 5px;">501</li><li style="box-sizing: border-box; padding: 0px 5px;">502</li><li style="box-sizing: border-box; padding: 0px 5px;">503</li><li style="box-sizing: border-box; padding: 0px 5px;">504</li><li style="box-sizing: border-box; padding: 0px 5px;">505</li><li style="box-sizing: border-box; padding: 0px 5px;">506</li><li style="box-sizing: border-box; padding: 0px 5px;">507</li><li style="box-sizing: border-box; padding: 0px 5px;">508</li><li style="box-sizing: border-box; padding: 0px 5px;">509</li><li style="box-sizing: border-box; padding: 0px 5px;">510</li><li style="box-sizing: border-box; padding: 0px 5px;">511</li><li style="box-sizing: border-box; padding: 0px 5px;">512</li><li style="box-sizing: border-box; padding: 0px 5px;">513</li><li style="box-sizing: border-box; padding: 0px 5px;">514</li><li style="box-sizing: border-box; padding: 0px 5px;">515</li><li style="box-sizing: border-box; padding: 0px 5px;">516</li><li style="box-sizing: border-box; padding: 0px 5px;">517</li><li style="box-sizing: border-box; padding: 0px 5px;">518</li><li style="box-sizing: border-box; padding: 0px 5px;">519</li><li style="box-sizing: border-box; padding: 0px 5px;">520</li><li style="box-sizing: border-box; padding: 0px 5px;">521</li><li style="box-sizing: border-box; padding: 0px 5px;">522</li><li style="box-sizing: border-box; padding: 0px 5px;">523</li><li style="box-sizing: border-box; padding: 0px 5px;">524</li><li style="box-sizing: border-box; padding: 0px 5px;">525</li><li style="box-sizing: border-box; padding: 0px 5px;">526</li><li style="box-sizing: border-box; padding: 0px 5px;">527</li><li style="box-sizing: border-box; padding: 0px 5px;">528</li><li style="box-sizing: border-box; padding: 0px 5px;">529</li><li style="box-sizing: border-box; padding: 0px 5px;">530</li><li style="box-sizing: border-box; padding: 0px 5px;">531</li><li style="box-sizing: border-box; padding: 0px 5px;">532</li><li style="box-sizing: border-box; padding: 0px 5px;">533</li><li style="box-sizing: border-box; padding: 0px 5px;">534</li><li style="box-sizing: border-box; padding: 0px 5px;">535</li><li style="box-sizing: border-box; padding: 0px 5px;">536</li><li style="box-sizing: border-box; padding: 0px 5px;">537</li><li style="box-sizing: border-box; padding: 0px 5px;">538</li><li style="box-sizing: border-box; padding: 0px 5px;">539</li><li style="box-sizing: border-box; padding: 0px 5px;">540</li><li style="box-sizing: border-box; padding: 0px 5px;">541</li><li style="box-sizing: border-box; padding: 0px 5px;">542</li><li style="box-sizing: border-box; padding: 0px 5px;">543</li><li style="box-sizing: border-box; padding: 0px 5px;">544</li><li style="box-sizing: border-box; padding: 0px 5px;">545</li><li style="box-sizing: border-box; padding: 0px 5px;">546</li><li style="box-sizing: border-box; padding: 0px 5px;">547</li><li style="box-sizing: border-box; padding: 0px 5px;">548</li><li style="box-sizing: border-box; padding: 0px 5px;">549</li><li style="box-sizing: border-box; padding: 0px 5px;">550</li><li style="box-sizing: border-box; padding: 0px 5px;">551</li><li style="box-sizing: border-box; padding: 0px 5px;">552</li><li style="box-sizing: border-box; padding: 0px 5px;">553</li><li style="box-sizing: border-box; padding: 0px 5px;">554</li><li style="box-sizing: border-box; padding: 0px 5px;">555</li><li style="box-sizing: border-box; padding: 0px 5px;">556</li><li style="box-sizing: border-box; padding: 0px 5px;">557</li><li style="box-sizing: border-box; padding: 0px 5px;">558</li><li style="box-sizing: border-box; padding: 0px 5px;">559</li><li style="box-sizing: border-box; padding: 0px 5px;">560</li><li style="box-sizing: border-box; padding: 0px 5px;">561</li><li style="box-sizing: border-box; padding: 0px 5px;">562</li><li style="box-sizing: border-box; padding: 0px 5px;">563</li><li style="box-sizing: border-box; padding: 0px 5px;">564</li><li style="box-sizing: border-box; padding: 0px 5px;">565</li><li style="box-sizing: border-box; padding: 0px 5px;">566</li><li style="box-sizing: border-box; padding: 0px 5px;">567</li><li style="box-sizing: border-box; padding: 0px 5px;">568</li><li style="box-sizing: border-box; padding: 0px 5px;">569</li><li style="box-sizing: border-box; padding: 0px 5px;">570</li><li style="box-sizing: border-box; padding: 0px 5px;">571</li><li style="box-sizing: border-box; padding: 0px 5px;">572</li><li style="box-sizing: border-box; padding: 0px 5px;">573</li><li style="box-sizing: border-box; padding: 0px 5px;">574</li><li style="box-sizing: border-box; padding: 0px 5px;">575</li><li style="box-sizing: border-box; padding: 0px 5px;">576</li><li style="box-sizing: border-box; padding: 0px 5px;">577</li><li style="box-sizing: border-box; padding: 0px 5px;">578</li><li style="box-sizing: border-box; padding: 0px 5px;">579</li><li style="box-sizing: border-box; padding: 0px 5px;">580</li><li style="box-sizing: border-box; padding: 0px 5px;">581</li><li style="box-sizing: border-box; padding: 0px 5px;">582</li><li style="box-sizing: border-box; padding: 0px 5px;">583</li><li style="box-sizing: border-box; padding: 0px 5px;">584</li><li style="box-sizing: border-box; padding: 0px 5px;">585</li><li style="box-sizing: border-box; padding: 0px 5px;">586</li><li style="box-sizing: border-box; padding: 0px 5px;">587</li><li style="box-sizing: border-box; padding: 0px 5px;">588</li><li style="box-sizing: border-box; padding: 0px 5px;">589</li><li style="box-sizing: border-box; padding: 0px 5px;">590</li><li style="box-sizing: border-box; padding: 0px 5px;">591</li><li style="box-sizing: border-box; padding: 0px 5px;">592</li><li style="box-sizing: border-box; padding: 0px 5px;">593</li><li style="box-sizing: border-box; padding: 0px 5px;">594</li><li style="box-sizing: border-box; padding: 0px 5px;">595</li><li style="box-sizing: border-box; padding: 0px 5px;">596</li><li style="box-sizing: border-box; padding: 0px 5px;">597</li><li style="box-sizing: border-box; padding: 0px 5px;">598</li><li style="box-sizing: border-box; padding: 0px 5px;">599</li><li style="box-sizing: border-box; padding: 0px 5px;">600</li><li style="box-sizing: border-box; padding: 0px 5px;">601</li><li style="box-sizing: border-box; padding: 0px 5px;">602</li><li style="box-sizing: border-box; padding: 0px 5px;">603</li><li style="box-sizing: border-box; padding: 0px 5px;">604</li><li style="box-sizing: border-box; padding: 0px 5px;">605</li><li style="box-sizing: border-box; padding: 0px 5px;">606</li><li style="box-sizing: border-box; padding: 0px 5px;">607</li><li style="box-sizing: border-box; padding: 0px 5px;">608</li><li style="box-sizing: border-box; padding: 0px 5px;">609</li><li style="box-sizing: border-box; padding: 0px 5px;">610</li><li style="box-sizing: border-box; padding: 0px 5px;">611</li><li style="box-sizing: border-box; padding: 0px 5px;">612</li><li style="box-sizing: border-box; padding: 0px 5px;">613</li><li style="box-sizing: border-box; padding: 0px 5px;">614</li><li style="box-sizing: border-box; padding: 0px 5px;">615</li><li style="box-sizing: border-box; padding: 0px 5px;">616</li><li style="box-sizing: border-box; padding: 0px 5px;">617</li><li style="box-sizing: border-box; padding: 0px 5px;">618</li><li style="box-sizing: border-box; padding: 0px 5px;">619</li><li style="box-sizing: border-box; padding: 0px 5px;">620</li><li style="box-sizing: border-box; padding: 0px 5px;">621</li><li style="box-sizing: border-box; padding: 0px 5px;">622</li><li style="box-sizing: border-box; padding: 0px 5px;">623</li><li style="box-sizing: border-box; padding: 0px 5px;">624</li><li style="box-sizing: border-box; padding: 0px 5px;">625</li><li style="box-sizing: border-box; padding: 0px 5px;">626</li><li style="box-sizing: border-box; padding: 0px 5px;">627</li><li style="box-sizing: border-box; padding: 0px 5px;">628</li><li style="box-sizing: border-box; padding: 0px 5px;">629</li><li style="box-sizing: border-box; padding: 0px 5px;">630</li><li style="box-sizing: border-box; padding: 0px 5px;">631</li><li style="box-sizing: border-box; padding: 0px 5px;">632</li><li style="box-sizing: border-box; padding: 0px 5px;">633</li><li style="box-sizing: border-box; padding: 0px 5px;">634</li><li style="box-sizing: border-box; padding: 0px 5px;">635</li><li style="box-sizing: border-box; padding: 0px 5px;">636</li><li style="box-sizing: border-box; padding: 0px 5px;">637</li><li style="box-sizing: border-box; padding: 0px 5px;">638</li><li style="box-sizing: border-box; padding: 0px 5px;">639</li><li style="box-sizing: border-box; padding: 0px 5px;">640</li><li style="box-sizing: border-box; padding: 0px 5px;">641</li><li style="box-sizing: border-box; padding: 0px 5px;">642</li><li style="box-sizing: border-box; padding: 0px 5px;">643</li><li style="box-sizing: border-box; padding: 0px 5px;">644</li><li style="box-sizing: border-box; padding: 0px 5px;">645</li><li style="box-sizing: border-box; padding: 0px 5px;">646</li><li style="box-sizing: border-box; padding: 0px 5px;">647</li><li style="box-sizing: border-box; padding: 0px 5px;">648</li><li style="box-sizing: border-box; padding: 0px 5px;">649</li><li style="box-sizing: border-box; padding: 0px 5px;">650</li><li style="box-sizing: border-box; padding: 0px 5px;">651</li><li style="box-sizing: border-box; padding: 0px 5px;">652</li><li style="box-sizing: border-box; padding: 0px 5px;">653</li><li style="box-sizing: border-box; padding: 0px 5px;">654</li><li style="box-sizing: border-box; padding: 0px 5px;">655</li><li style="box-sizing: border-box; padding: 0px 5px;">656</li><li style="box-sizing: border-box; padding: 0px 5px;">657</li><li style="box-sizing: border-box; padding: 0px 5px;">658</li><li style="box-sizing: border-box; padding: 0px 5px;">659</li><li style="box-sizing: border-box; padding: 0px 5px;">660</li><li style="box-sizing: border-box; padding: 0px 5px;">661</li><li style="box-sizing: border-box; padding: 0px 5px;">662</li><li style="box-sizing: border-box; padding: 0px 5px;">663</li><li style="box-sizing: border-box; padding: 0px 5px;">664</li><li style="box-sizing: border-box; padding: 0px 5px;">665</li><li style="box-sizing: border-box; padding: 0px 5px;">666</li><li style="box-sizing: border-box; padding: 0px 5px;">667</li></ul>
实验数据和结果展示
数据csv格式
<code class="hljs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">0 28.224016691 33.249216932 35.820842773 36.870968784 30.984885315 38.782212966 38.467533247 41.960658458 36.826564139 35.508112110 35.7464718111 36.1711098712 37.5116599913 41.2710925714 44.0384267715 48.0300170516 45.5040184317 45.0263560818 51.7057403419 46.7635988120 52.648759521 48.8138359322 50.6945125423 55.5420040324 54.5563958625 53.1903622326 58.8926909127 54.7888425128 57.903395129 62.2111496730 64.5102546831 62.2071053732 62.9473630433 60.3044793334 65.3204440635 65.8290345236 66.3787221637 69.7564055338 66.0211259439 65.8711903940 74.2720975141 67.5766162842 73.1944408843 69.453311744 74.9112981745 71.2118760946 77.096254547 81.9506683748 78.0463683849 83.4284252650 80.4021756351 78.6865020652 82.9139521553 85.0966311554 88.7154090755 87.7395556 89.1865477657 91.0933744158 83.9561442259 93.3068317960 93.2761859661 88.0785923862 89.1066785663 95.6144366664 93.3989910665 94.3825875866 96.8764180267 96.8789694668 97.009441269 100.07611570 104.761990571 100.791709372 99.8552336273 106.901849474 103.606106375 103.410505876 106.430457677 110.735724978 107.042045579 107.283422180 113.929949681 111.218762782 116.410059683 108.023725684 112.777359285 117.346495786 117.197680787 120.053852188 114.458496489 122.2860022</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li></ul>
结果展示
横轴是迭代次数,纵轴是代价
总结
不管什么最优化方法,都是试图去寻找代价下降最快的方向和合适的步幅。
前面介绍了参数寻优的传统方法,梯度下降,牛顿下降等,传统的参数寻优方法,都是提供了下降的方向和大小参考。如果参数非常多,成千上万个参数,很多峰谷时,有没有较好的方法去估计最优解呢。本文介绍的方法就是在没有下降参考的情况下,如何去估计最优解,其中包括遗传算法,粒子群算法,蚁群算法,都是仿生物学算法。
启发式搜索
启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置搜索直到目标。由部分信息对计算产生推理,个体能够基于经验或者个体经验交流改变搜索方式。不同于穷举搜索(网格法)和随机搜索(模拟退火算法)。
遗传算法
遗传算法(GA)的思想来自于进化论,生物种群具有自我进化的能力,能够不断适应环境,优势劣汰之后得到最优的种群个体。进化的行为主要有选择,遗传,变异,遗传算法希望能够通过将初始解空间进化到一个较好的解空间。
遗传算法的大体步骤:
1. 初始化候选参数集,并编码为基因序列{ 初始化种群,一组参数编码为一个种群个体,共M个种群个体 }。设定进化代数T。
2. 个体评估,计算各个种群个体的适应度{ 适应度描述了该个体对自然环境的适应能力,表征了其个体存活能力和生殖机会}。
3. 选择运算,选择是模拟自然选择,把优秀的个体选择出来{基于适应度},以进行后续的遗传和变异。
4. 交叉运算,交叉是模拟繁殖后代的基因重组。
5. 变异运算,变异是模拟基因突变。
6. 经过选择,交叉,变异,生产下一代群体,重复此过程,直到停止条件。
适应度函数的设计要求(由目标函数而来):
1. 单值,连续,非负,最大化;
2. 合理,一致性;
3. 计算量小。
将目标函数,或者线性变化
遗传算法的优缺点:
1. 通用性强,且简单易于理解。
2. 潜在的并行性。
3. 参数选择经验居多。
4. 搜索速度慢。
粒子群算法
粒子群算法(Particle Swarm Optimization, PSO),是在研究复杂适应系统(Complex Adaptive System, CAS)-鸟群觅食的过程中提出的。
CAS系统的主体(系统成员)具有4个基本特点:(这些特点是粒子群算法发展变化的依据)
1. 主体是主动的,活动的。
2. 主体与环境及其他主体是相互影响、相互作用的,这种影响是系统发展变化的主要动力。
3. 环境的影响是宏观的,主体之间的影响是微观的,宏观与微观要有机结合。
4. 整个系统可能还要受一些随机因素的影响。
鸟群觅食场景:一群鸟随机地找食物,只有一小片区域是有食物的。每个鸟在自己周边蹦跳,然后叫几声,跟同伴交流食物情况。有个鸟说“哎,我这里有吃的”,然后其他鸟都朝着它所在的方向飞,中间停下来再找。重复上面的过程,最后鸟儿都会集中到有食物的地方。其搜索策略是所有参数都向着当前最优参数的区域搜索(搜索目前离食物最近的鸟的周围区域)。
粒子群算法的大体步骤:
1. 初始化参数集
2. 分别搜索各个参数附近的局部最优解
3. 更新速度:
更新位置(参数):
4. 判断终止条件,不符合则否则重复2,3,4步骤。
其中
粒子群算法的优缺点:
1. 算法规则简单,容易实现。
2. 收敛速度快,有很多措施避免陷入局部最优。
3. 可调参数少,参数选择有理论支持(Eberhart-A modified particle swarm optimizer)。
蚁群算法
蚁群算法(ACO)是一种模拟蚂蚁觅食行为的模拟优化算法,其基本思想是:当蚂蚁沿着一条路径到达终点以后会马上返回来,这样,短的路径蚂蚁往返一次的时间就短,意味着重复频率快,因而在单位时间内走过的蚂蚁数量就多,洒下的信息素也就多,自然会有更多的蚂蚁被吸引过来,从而洒下更多的信息素;而长路径则相反,因此最后越来越多的蚂蚁集中到了较短的路径上,最短路径也就近似找到了。
信息素:蚂蚁留在路径上用于间接交流的物质,可挥发,。信息素多的地方显然经过的蚂蚁多,也会吸引更多的蚂蚁过来。
正反馈:在某一路径走过的蚂蚁越多,信息素越多,蚂蚁选择该路径的概率越大。
例子:由蚁群算法解决TSP(Traveling Salesman Problem)问题。TSP问题,在多个城市中,找到访问完所有城市的最短路径。设
蚂蚁系统中的人工蚂蚁特点:
1. 蚂蚁依据某一概率函数选择下一步要到的城市,该概率函数是城市间距离
2. 每只蚂蚁只允许走合法路径(除非是一次周游,返回起点),不允许走已经访问过的城市。该过程由禁忌表
3. 完成一次周游后,蚂蚁在其访问过的每一条边上留下相应的信息素。
蚁群算法解决TSP问题的大体步骤:
1. 初始化
1.1 位置初始化,将
1.2 信息素初始化,信息素量设为
2. 路径查找
2.1 下一步路径查找,根据概率
其中
2.2 所有蚂蚁查找完一次周游路径。
3. 更新信息素
其中,
4. 是否符合终止条件(迭代次数),若不满足,则清空禁忌表(保留第一个值),保留信息素。返回第2步。
包括上面那种,分别称为
蚁群算法的优缺点:
1. 蚁群算法是一种自组织算法,基于简单规则(多样性和正反馈规则,前者表现创造力,后者是学习强化能力)。
2. 并行性。
3. 正反馈,引导系统向着最优解方向进化。
4. 对初始路线要求不高。
5. 参数初始选择原则暂无理论支持。
6. 搜索时间较长。
7. 会陷入局部解,停滞现象。
http://blog.163.com/ykn_2010/blog/static/1420333362012111411258466/ 一个蚁群算法的介绍博客。
http://www.ailab.cn/algorithm/ant/201110015765.html 蚁群算法的一些文献资源。
免疫算法
免疫算法是改进了遗传算法的退化问题,因为遗传算法的交叉和变异算子是固定的。
小结
仿生学。
应用广泛。
初始集为解集合,而不是单个解。
复杂系统,由简单规则支配。
- 参数寻优问题详细解析
- GHOST参数详细解析
- Gabor滤波参数详细解析
- android PendingIntent参数详细解析
- C++默认参数详细解析
- ffmpeg 工具 参数详细解析
- android PendingIntent参数详细解析
- ffmpeg 工具 参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- Linux操作系统内核启动参数详细解析
- 在Android studio 下 获取SHA1 签名证书
- ListView工作流程
- Android中实现短信验证功能
- hiho1234--Fractal(高精度)
- 知道怎么修改自己程序版本号吗?
- 参数寻优问题详细解析
- 一个绚丽的loading动效分析与实现!
- linux应用编程笔记(5)系统调用文件编程方法实现文件复制
- usb can转换设备,“引领”USBCAN产品族
- 《php和mysql web开发》笔记——第4章 字符串操作与正则表达式
- java 通配符解惑
- 开源软件的许可协议 License
- iOS9 适配
- 面试中必知必会的那些题——第一题 单链表倒置