四季交替,
光阴推动了变更,
但你一直印在我心。
遇见你的那天,
心似击鼓般兴奋,
呼吸似乎都有了震音。
想你想的入神,
想你充满能量,
想你醒了也像晕了,
想你不由自主的笑了。
——畅宝宝的傻逼哥哥
对于步骤1, d01,d02,…,d0n 为坐标方向。对于步骤2, f(x) 沿着 xk0,xk1,…,xkn 最小化。对于步骤3, f(x) 在新的共轭方向最小化,对于凸二维问题来说,该算法搜索模式如图4所示。
Powell算法的主要优点是不需要海森矩阵,更进一步,通过使用基于线搜索的一维算法,梯度也不需要。
但是Powell算法有时候不一定线性无关,这样的话生成的方向集无法生成
En
,即便是凸二次问题也存在这样的情况,如果第二步中最小化
f(xk(j−1)+αdkj)
时存在某个
j
使得
即新生成的方向不包含
dkj
,因为
dkj
别舍弃掉了,这样的
n
个方向集合无法张成
上面的问题可以被避免到,那就是如果出现线性相关,那么下次迭代的话我们不改变方向集,然后得到新的共轭方向。因为下次迭代的时候我们是从新的点
xk
开始的,所以是可能产生新的方向的。
图4
原则上如果至少有一个 αki 为零,那么将产生线性相关。不幸的是,由于计算机精度有限, αki 的值不可能为零,所以检查 αki 不是可靠的方法,接下里介绍一种可替代的方法,依然是Powell得出来的。
如果方向向量
dki,i=1,2,…,n
被归一化使得
那么矩阵的行列式
要想为最大值,那么当且仅当方向 dki 属于共轭集合,所以如果舍弃非共轭方向 d1k 然后将共轭方向 dk(n+1) 加入到 D 中,那么 D 的行列式将会增加。另一方面,如果 dk(n+1) 的加入使得 D 内产生线性相关,那么 D 的行列式将减小。基于这个原则,Powell开发了修正的算法,该算法中使用一个测试来确定新生成的方向是否用于下次迭代,该测试也能识别是否 n 个老方向中的一个用新方向来替代,所以减小了线性相关的风险。
有个非常相似的技术也是用来消除线性相关,该方法由Zangwill提出。从计算上看,该方法比Powell修正更加经济有效,因此很值得详细的介绍一下。
Zangwill的方法是在Powell算法上进行了如下修正。
- 步骤1中的初始方向选为单位坐标向量集
D0=[d01 d02 ⋯ d0n]=⎡⎣⎢⎢⎢⎢10⋮001⋮0⋯⋯⋯00⋮1⎤⎦⎥⎥⎥⎥
D0 的行列式 Δ0 为单位1。- 步骤2中确定
αki,i=1,2,…,n
的方法跟以前一样,然后选出最大的
αki
即
αkm=max{αk1,αk2,…,αkn} - 步骤3中跟以前一样生成新的方向,然后归一化,
dk(n+1)=1λk(xkn−xk0) 其中
λk=∥xkn−xk0∥- 步骤4不变,步骤5中,用上面得到的新方向代替方向
dkm
,当然前提是这个替换能够保证
Dk=[dk1 dk2 ⋯ kn]
的行列式有限且比常数 ε1 大,其中 0<ε1≤1 ,即
0<ε1<Δk=detDk≤1否则的话,我们用最近的方向集用于下次迭代。因为
Δk=det[dk1 ⋯ dk(m−1) dkm dk(m+1) ⋯ dkn]且
dk(n+1)=1λk∑i=1nαkidki代替了 dkm ,所以
Δ′k=αkmαkΔk注意这里补充两个知识点
- 如果常数乘以一列并加到另一列,那么行列式不变。
- 如果某列乘以常数,那么行列式同样乘以该常数。
根据第一个知识点可知 Δ′k 相加的效果可以消除掉,根据第二个知识点可知需要乘以 αkm/λk 。如果
αkmλkΔk>ε1
那么我们令
d(k+1)m=dk(n+1)d(k+1)i=dki其中 i=1,2,…,m−1,m+1,…,n 。否则的话
d(k+1)i=dki其中 i=1,2,…,n 。同时也要更新 Δk
δk+1={αkmλkΔkΔkif αkmλkΔk>ε1otherwise上面修正得到的结果就是方向矩阵的行列式一直有限且为正,这就表明方向一直是线性无关的。第二项的策略能够确保行列式的值 Δk 尽可能大,从而避免线性相关。
修正的算法称为Zangwill算法,对于凸二次问题来说,该算法能够收敛。
- 步骤4不变,步骤5中,用上面得到的新方向代替方向
dkm
,当然前提是这个替换能够保证
- 步骤2中确定
αki,i=1,2,…,n
的方法跟以前一样,然后选出最大的
αki
即