1. 程式人生 > >基礎數學知識(一)——拉格朗日乘子法

基礎數學知識(一)——拉格朗日乘子法

  這幾天一直在看支援向量機,然後就是大量大量的數學公式,一直迷迷糊糊的,然後一直遇到拉格朗日,拉格朗日,原來數學基礎也不好,沒怎麼學過,於是下定決心要把拉格朗日乘子法搞懂,花了幾天,看了一些文章,算是對拉格朗日乘子法有了簡單的瞭解,下面就和大家簡單的分享分享啦!
  
  我們在求解優化問題的時候,可能小夥伴們遇到的最大的困難就是約束條件了,想想如果沒有約束條件是一件多麼愉快的事情,但是往往事與願違哈哈!一般我們遇到比較簡單一點問題的可能就是等式約束,但是稍微複雜一點的題目都會涉及到不等式約束,所以,這個時候就要根據實際情況選取不同的方法咯。一般情況下,最優化問題會有三類:

(一)、無約束條件


  這種情況想都不用想,直接對變數求導等於0,代入原函式驗證即可。

(二)、等式約束條件
  我們假定目標函式為f(x),約束條件為h_k(x)。
     minf(x)     (最大值最小值問題可以相互轉化)
    s.t.hk(x)=0k=1,2,3...
  我們原來高中學過的消元法不失為一種好方法,但是畢竟比較Low,體現不出優秀的你的水平哈哈,不開玩笑了,主要是消元的時候會很麻煩,比如說有高次的情況,開根號帶來了計算時許多不便之處,而拉格朗日就厲害了,為什麼這麼講呢,我們一起來看看:
  拉格朗日乘子法的求解流程大概包括以下幾個步驟:
   1. 構造拉格朗日函式


   2. 解變數的偏導方程
   3. 代入目標函式即可
  是不是看上去很簡單,其實的確不麻煩(==,吐槽一下當時看向量機的時候,還一直糾結著看不懂,但其實本身這個方法並沒有想象的那麼難)。關鍵在於構造拉格朗日函式,後面求解實際上就是高數裡面基本的求偏導數的問題了。我們不妨另:
   F(x,λ)=f(x)+k=1lλkhk(x)    (公式不好打!!!)

  然後分別對每一個變數求導,得出來的解代入目標函式就ok了!

   Fλk=0 Fxi=0

(三)、不等式約束條件
  不等式約束相比於等式約束,要複雜一點,而且通常情況下,不等式約束和等式約束總喜歡一起出現,在這裡,為了更好的解決該問題,除了拉格朗日乘子外,我們引入了KKT條件。什麼是KKT條件呢?KKT條件是怎麼來的呢?我們不妨先看看我們的問題:
       

minf(x)
     s.t.hi(x)=0i=1,2,3...p
     s.t.gj(x)<=0j=1,2,3...q

  那麼我們定義的拉格朗日函式又是什麼呢,其實很容易想到:

   F(x,λ,l)=f(x)+i=1pλihi(x)+j=1qujgj(x)

  其中,f(x)是目標函式,hi(x)是第i個等式約束條件,λi是對應的約束係數,gj(x)是不等式約束,uj是對應的約束係數。這裡把目標函式,等式約束,不等式約束融合到了一個式子裡,這時候KKT約束就出場了:

 (1). F(x,λ,l)** 對 x求偏導為 0;

 (2). h(x)=0

 (3). ag(x)=0

  至於為什麼這麼來的,由於時間問題不跟大家作詳細的推導啦,網上百度一下到處都有的。(附個連結:可以隨便看看,講的挺好的
  基於KKT條件,不等式約束條件的問題基本也就解決了,下面來說說我自己的一點心得吧!
第一點:拉格朗日乘子法求解優化問題是很有效的方法,對於限制條件比較多的情況下,特別是限制條件較為複雜的情況下,利用該方法可以很容易的求解出來。
第二點:約束條件其實就是限定了問題的解決範圍,學會如何轉化和考量限制條件是解決問題的關鍵。
第三點:基礎知識的重要性,比如說高數如果學不好的話,在KKT條件的推導過程中,會遇到很多痛苦(對於數學基礎不好的我感觸尤深 = =)。
  
  就這樣啦,第一次部落格,問題挺多的,後面再加強!!!