未来的你已在我的身边,
虽然经过了很多个弯;
现在的我已经没了号码牌,
虽然已经相伴了很多年。
遇见你,是我最美的意外。
——畅宝宝的傻逼哥哥
大部分算法计算效率是有很大差别的,高效或者快速的算法仅需要少量的迭代就能收敛到解,并且计算量也很小。从经济的角度来说,我们会选择选择最有效的算法,因此我们就需要度量算法收敛速率的定量指标或准则。
最基本的准则是序列的收敛阶,如果{xk}∞k=0 是实数序列,那么它的收敛阶就是最大的非负整数p ,满足关系
0≤β<∞
其中
β=limk→∞|xk+1−x̂ ||xk−x̂ |p(1)
x̂ 是
k→∞ 的极限,参数
β 称为收敛比。
例1: 如果
- xk=γk, for 0<γ<1
- xk=γ2k, for 0<γ<1
那么求出序列{xk}∞k=0 的收敛阶与收敛比。
解: (a)因为x̂ =0 ,所以
β=limk→∞γk(1−p)+1
对于p=0,1,2 ,我们有β=0,γ,∞ ,所以p=1,β=γ 。
(b)
β=limk→∞γ2(k+1)γ2kp=limk→∞{γ2k(2−p)}
对于p=0,1,2,3 ,我们有β=0,0,1,∞ ,所以p=2,β=1 。
如果等式(1)的极限存在,那么
limk→∞|xk−x̂ |=ε
其中ε<1 ,所以
limk→∞|xk+1−x̂ |=βεp
所以p 增加或者β 减少的话,收敛速率在增加。如果ρ=0.8 ,那么(a)(b)的序列分别为
{xk}∞k={1,0.8,0.64.0.512,0.409,…,0}
与
{xk})∞k=0={1,0.64,0.409,0.167,0.023,…,0}
第二个序列的收敛速率比第一个更快。
如果p=1,β<1 ,那么我们称序列是线性收敛的;如果p=1,β=0 或者p≥2 ,那么称序列是超线性收敛的。
大部分非线性规划算法都是线性收敛的,因此他们的比较都是基于β 值。
另一种度量序列收敛速率的是平均收敛阶数,也就是满足关系
ρ=limk→∞|xk−x̂ |1/(p+1)k=1
的最小非负整数。如果不存在p>0 ,那么收敛的阶数为无穷大。
例2: 找出序列{xk}∞k=0 的平均收敛阶数
- xk=γk, for 0<γ<1
- xk=γ2k, for 0<γ<1
解: (a)因为x̂ =0 ,
ρ=limk→∞(ρk)1/(p+1)k=1
所以对于p=0,1,2 ,我们有ρ=0,1,1 ,因此p=1 。
(b)
ρ=limk→∞(ρ2k)1/(p+1)k=1
所以对于p=0,1,2,3 ,我们有ρ=0,ρ,1,1 ,因此p=2 。
如果收敛的平均阶数是单位1,那么我们称序列是平均线性收敛,平均线性收敛定义为
ρ=limk→∞|xk−x̂ |1/k
上面的讨论中,我们考虑的是数列的收敛性。随着越来越靠近解,这样的序列可能由目标函数的值构成,这时候我们度量目标函数靠近其最小值的速度。或者说,如果我们想知道问题靠近最优解有多快,可以用向量xk−x̂ 的长度或长度的平方,即∥xk−x̂ ∥ 或者∥xk−x̂ ∥2 。
上面收敛速率的度量中,重点都是在解邻域内考虑算法的有效性。通常而言优化的大部分计算都花在解的邻域内,所以上面的度量是很有意义的。然而偶尔会有些算法在解的邻域内有效而其他地方无效。这时候上面的判别准则会误导我们,所以需要改用其他的准则。