基礎數學知識(一)——拉格朗日乘子法
這幾天一直在看支援向量機,然後就是大量大量的數學公式,一直迷迷糊糊的,然後一直遇到拉格朗日,拉格朗日,原來數學基礎也不好,沒怎麼學過,於是下定決心要把拉格朗日乘子法搞懂,花了幾天,看了一些文章,算是對拉格朗日乘子法有了簡單的瞭解,下面就和大家簡單的分享分享啦!
我們在求解優化問題的時候,可能小夥伴們遇到的最大的困難就是約束條件了,想想如果沒有約束條件是一件多麼愉快的事情,但是往往事與願違哈哈!一般我們遇到比較簡單一點問題的可能就是等式約束,但是稍微複雜一點的題目都會涉及到不等式約束,所以,這個時候就要根據實際情況選取不同的方法咯。一般情況下,最優化問題會有三類:
(一)、無約束條件
這種情況想都不用想,直接對變數求導等於0,代入原函式驗證即可。
(二)、等式約束條件
我們假定目標函式為f(x),約束條件為h_k(x)。
(最大值最小值問題可以相互轉化)
我們原來高中學過的消元法不失為一種好方法,但是畢竟比較Low,體現不出優秀的你的水平哈哈,不開玩笑了,主要是消元的時候會很麻煩,比如說有高次的情況,開根號帶來了計算時許多不便之處,而拉格朗日就厲害了,為什麼這麼講呢,我們一起來看看:
拉格朗日乘子法的求解流程大概包括以下幾個步驟:
1. 構造拉格朗日函式
2. 解變數的偏導方程
3. 代入目標函式即可
是不是看上去很簡單,其實的確不麻煩(==,吐槽一下當時看向量機的時候,還一直糾結著看不懂,但其實本身這個方法並沒有想象的那麼難)。關鍵在於構造拉格朗日函式,後面求解實際上就是高數裡面基本的求偏導數的問題了。我們不妨另:
(公式不好打!!!)
然後分別對每一個變數求導,得出來的解代入目標函式就ok了!
…
(三)、不等式約束條件
不等式約束相比於等式約束,要複雜一點,而且通常情況下,不等式約束和等式約束總喜歡一起出現,在這裡,為了更好的解決該問題,除了拉格朗日乘子外,我們引入了KKT條件。什麼是KKT條件呢?KKT條件是怎麼來的呢?我們不妨先看看我們的問題:
那麼我們定義的拉格朗日函式又是什麼呢,其實很容易想到:
其中,f(x)是目標函式,是第i個等式約束條件,是對應的約束係數,是不等式約束,是對應的約束係數。這裡把目標函式,等式約束,不等式約束融合到了一個式子裡,這時候KKT約束就出場了:
(1). ** 對 求偏導為 0;
(2). ;
(3). ;
至於為什麼這麼來的,由於時間問題不跟大家作詳細的推導啦,網上百度一下到處都有的。(附個連結:可以隨便看看,講的挺好的)
基於KKT條件,不等式約束條件的問題基本也就解決了,下面來說說我自己的一點心得吧!
第一點:拉格朗日乘子法求解優化問題是很有效的方法,對於限制條件比較多的情況下,特別是限制條件較為複雜的情況下,利用該方法可以很容易的求解出來。
第二點:約束條件其實就是限定了問題的解決範圍,學會如何轉化和考量限制條件是解決問題的關鍵。
第三點:基礎知識的重要性,比如說高數如果學不好的話,在KKT條件的推導過程中,會遇到很多痛苦(對於數學基礎不好的我感觸尤深 = =)。
就這樣啦,第一次部落格,問題挺多的,後面再加強!!!