未來的你已在我的身邊,
雖然經過了很多個彎;
現在的我已經沒了號碼牌,
雖然已經相伴了很多年。
遇見你,是我最美的意外。
——暢寶寶的傻逼哥哥
大部分算法計算效率是有很大差別的,高效或者快速的算法僅需要少量的迭代就能收斂到解,並且計算量也很小。從經濟的角度來說,我們會選擇選擇最有效的算法,因此我們就需要度量算法收斂速率的定量指標或準則。
最基本的準則是序列的收斂階,如果{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 。
上面收斂速率的度量中,重點都是在解鄰域內考慮算法的有效性。通常而言優化的大部分計算都花在解的鄰域內,所以上面的度量是很有意義的。然而偶爾會有些算法在解的鄰域內有效而其他地方無效。這時候上面的判別準則會誤導我們,所以需要改用其他的準則。