分類:
機器學習
2012-09-22 17:05
17379人閱讀收藏
舉報在求取有約束條件的優化問題時,拉格朗日乘子法(lagrange multiplier) 和kkt條件是非常重要的兩個求取方法,對於等式約束的優化問題,可以應用拉格朗日乘子法去求取最優值;如果含有不等式約束,可以應用kkt條件去求取。當然,這兩個方法求得的結果只是必要條件,只有當是凸函式的情況下,才能保證是充分必要條件。kkt條件是拉格朗日乘子法的泛化。之前學習的時候,只知道直接應用兩個方法,但是卻不知道為什麼拉格朗日乘子法(lagrange multiplier) 和kkt條件能夠起作用,為什麼要這樣去求取最優值呢?
本文將首先把什麼是拉格朗日乘子法(lagrange multiplier) 和kkt條件敘述一下;然後開始分別談談為什麼要這樣求最優值。
一. 拉格朗日乘子法(lagrange multiplier) 和kkt條件
通常我們需要求解的最優化問題有如下幾類:
(i) 無約束優化問題,可以寫為:
min f(x);
(ii) 有等式約束的優化問題,可以寫為:
min f(x),
s.t. h_i(x) = 0; i =1, ..., n
(iii) 有不等式約束的優化問題,可以寫為:
min f(x),
s.t. g_i(x) <= 0; i =1, ..., n
h_j(x) = 0; j =1, ..., m
對於第(i)類的優化問題,常常使用的方法就是fermat定理,即使用求取f(x)的導數,然後令其為零,可以求得候選最優值,再在這些候選值中驗證;如果是凸函式,可以保證是最優解。
對於第(ii)類的優化問題,常常使用的方法就是拉格朗日乘子法(lagrange multiplier) ,即把等式約束h_i(x)用乙個係數與f(x)寫為乙個式子,稱為拉格朗日函式,而係數稱為拉格朗日乘子。通過拉格朗日函式對各個變數求導,令其為零,可以求得候選值集合,然後驗證求得最優值。
對於第(iii)類的優化問題,常常使用的方法就是kkt條件。同樣地,我們把所有的等式、不等式約束與f(x)寫為乙個式子,也叫拉格朗日函式,係數也稱拉格朗日乘子,通過一些條件,可以求出最優值的必要條件,這個條件稱為kkt條件。
(a) 拉格朗日乘子法(lagrange multiplier)
對於等式約束,我們可以通過乙個拉格朗日係數a 把等式約束和目標函式組合成為乙個式子l(a, x) = f(x) + a*h(x), 這裡把a和h(x)視為向量形式,a是橫向量,h(x)為列向量,之所以這麼寫,完全是因為csdn很難寫數學公式,只能將就了.....。
然後求取最優值,可以通過對l(a,x)對各個引數求導取零,聯立等式進行求取,這個在高等數學裡面有講,但是沒有講為什麼這麼做就可以,在後面,將簡要介紹其思想。
(b) kkt條件
對於含有不等式約束的優化問題,如何求取最優值呢?常用的方法是kkt條件,同樣地,把所有的不等式約束、等式約束和目標函式全部寫為乙個式子l(a, b, x)= f(x) + a*g(x)+b*h(x),kkt條件是說最優值必須滿足以下條件:
1. l(a, b, x)對x求導為零;
2. h(x) =0;
3. a*g(x) = 0;
求取這三個等式之後就能得到候選最優值。其中第三個式子非常有趣,因為g(x)<=0,如果要滿足這個等式,必須a=0或者g(x)=0. 這是svm的很多重要性質的**,如支援向量的概念。
二. 為什麼拉格朗日乘子法(lagrange multiplier) 和kkt條件能夠得到最優值?
為什麼要這麼求能得到最優值?先說拉格朗日乘子法,設想我們的目標函式z = f(x), x是向量, z取不同的值,相當於可以投影在x構成的平面(曲面)上,即成為等高線,如下圖,目標函式是f(x, y),這裡x是標量,虛線是等高線,現在假設我們的約束g(x)=0,x是向量,在x構成的平面或者曲面上是一條曲線,假設g(x)與等高線相交,交點就是同時滿足等式約束條件和目標函式的可行域的值,但肯定不是最優值,因為相交意味著肯定還存在其它的等高線在該條等高線的內部或者外部,使得新的等高線與目標函式的交點的值更大或者更小,只有到等高線與目標函式的曲線相切的時候,可能取得最優值,如下圖所示,即等高線和目標函式的曲線在該點的法向量必須有相同方向,所以最優值必須滿足:f(x)的梯度 = a* g(x)的梯度,a是常數,表示左右兩邊同向。這個等式就是l(a,x)對引數求導的結果。(上述描述,我不知道描述清楚沒,如果與我物理位置很近的話,直接找我,我當面講好理解一些,注:下圖來自wiki)。
而kkt條件是滿足強對偶條件的優化問題的必要條件,可以這樣理解:我們要求min f(x), l(a, b, x) = f(x) + a*g(x) + b*h(x),a>=0,我們可以把f(x)寫為:max_ l(a,b,x),為什麼呢?因為h(x)=0, g(x)<=0,現在是取l(a,b,x)的最大值,a*g(x)是<=0,所以l(a,b,x)只有在a*g(x) = 0的情況下才能取得最大值,否則,就不滿足約束條件,因此max_ l(a,b,x)在滿足約束條件的情況下就是f(x),因此我們的目標函式可以寫為 min_x max_ l(a,b,x)。如果用對偶表示式: max_ min_x l(a,b,x),由於我們的優化是滿足強對偶的(強對偶就是說對偶式子的最優值是等於原問題的最優值的),所以在取得最優值x0的條件下,它滿足 f(x0) = max_ min_x l(a,b,x) = min_x max_ l(a,b,x) =f(x0),我們來看看中間兩個式子發生了什麼事情:
f(x0) = max_ min_x l(a,b,x) =
max_ min_x f(x) + a*g(x) + b*h(x) =
max_ f(x0)+a*g(x0)+b*h(x0)= f(x0)
可以看到上述加黑的地方本質上是說 min_x f(x) + a*g(x) + b*h(x) 在x0取得了最小值,用fermat定理,即是說對於函式 f(x) + a*g(x) + b*h(x),求取導數要等於零,即
f(x)的梯度+a*g(x)的梯度+ b*h(x)的梯度 = 0
這就是kkt條件中第乙個條件:l(a, b, x)對x求導為零。
而之前說明過,a*g(x) = 0,這時kkt條件的第3個條件,當然已知的條件h(x)=0必須被滿足,所有上述說明,滿足強對偶條件的優化問題的最優值都必須滿足kkt條件,即上述說明的三個條件。可以把kkt條件視為是拉格朗日乘子法的泛化。
乙個sql的優化
原文 乙個sql的優化 目的 為了查詢某天某個伺服器上的登入id的個數 剛開始編寫的sql select count a.mac logusers from log maclogin all a where ismoni 1 and logintime 2015 02 01 23 59 59 and...
轉乙個幾種常用排序演算法的動畫效果
介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n 2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實...
關於乙個加法優化的乙個地方
include include include base.h int main int argc,char argv,char envp 下面是彙編 01291000 55 push ebp 01291001 8bec mov ebp,esp 01291003 56 push esi 0129100...