这几天一直在看支持向量机,然后就是大量大量的数学公式,一直迷迷糊糊的,然后一直遇到拉格朗日,拉格朗日,原来数学基础也不好,没怎么学过,于是下定决心要把拉格朗日乘子法搞懂,花了几天,看了一些文章,算是对拉格朗日乘子法有了简单的了解,下面就和大家简单的分享分享啦!
我们在求解优化问题的时候,可能小伙伴们遇到的最大的困难就是约束条件了,想想如果没有约束条件是一件多么愉快的事情,但是往往事与愿违哈哈!一般我们遇到比较简单一点问题的可能就是等式约束,但是稍微复杂一点的题目都会涉及到不等式约束,所以,这个时候就要根据实际情况选取不同的方法咯。一般情况下,最优化问题会有三类:
(一)、无约束条件
这种情况想都不用想,直接对变量求导等于0,代入原函数验证即可。
(二)、等式约束条件
我们假定目标函数为f(x),约束条件为h_k(x)。
minf(x) m i n f ( x ) (最大值最小值问题可以相互转化)
s.t. hk(x)=0,k=1,2,3... s . t . h k ( x ) = 0 , k = 1 , 2 , 3...
我们原来高中学过的消元法不失为一种好方法,但是毕竟比较Low,体现不出优秀的你的水平哈哈,不开玩笑了,主要是消元的时候会很麻烦,比如说有高次的情况,开根号带来了计算时许多不便之处,而拉格朗日就厉害了,为什么这么讲呢,我们一起来看看:
拉格朗日乘子法的求解流程大概包括以下几个步骤:
1. 构造拉格朗日函数
2. 解变量的偏导方程
3. 代入目标函数即可
是不是看上去很简单,其实的确不麻烦(==,吐槽一下当时看向量机的时候,还一直纠结着看不懂,但其实本身这个方法并没有想象的那么难)。关键在于构造拉格朗日函数,后面求解实际上就是高数里面基本的求偏导数的问题了。我们不妨另:
F(x,λ)=f(x)+∑lk=1λkhk(x) F ( x , λ ) = f ( x ) + ∑ k = 1 l λ k h k ( x ) (公式不好打!!!)
然后分别对每一个变量求导,得出来的解代入目标函数就ok了!
∂Fλk=0 ∂ F λ k = 0 ∂Fxi=0 ∂ F x i = 0 …
(三)、不等式约束条件
不等式约束相比于等式约束,要复杂一点,而且通常情况下,不等式约束和等式约束总喜欢一起出现,在这里,为了更好的解决该问题,除了拉格朗日乘子外,我们引入了KKT条件。什么是KKT条件呢?KKT条件是怎么来的呢?我们不妨先看看我们的问题:
minf(x) m i n f ( x )
s.t. hi(x)=0,i=1,2,3...p s . t . h i ( x ) = 0 , i = 1 , 2 , 3... p
s.t. gj(x)<=0,j=1,2,3...q s . t . g j ( x ) <= 0 , j = 1 , 2 , 3... q
那么我们定义的拉格朗日函数又是什么呢,其实很容易想到:
F(x,λ,l)=f(x)+∑pi=1λihi(x)+∑qj=1ujgj(x) F ( x , λ , l ) = f ( x ) + ∑ i = 1 p λ i h i ( x ) + ∑ j = 1 q u j g j ( x )
其中,f(x)是目标函数, hi(x) h i ( x ) 是第i个等式约束条件, λi λ i 是对应的约束系数, gj(x) g j ( x ) 是不等式约束, uj u j 是对应的约束系数。这里把目标函数,等式约束,不等式约束融合到了一个式子里,这时候KKT约束就出场了:
(1). F(x,λ,l) F ( x , λ , l ) ** 对 x x 求偏导为 0;
(2). h(x)=0 h ( x ) = 0 ;
(3). a∗g(x)=0 a ∗ g ( x ) = 0 ;
至于为什么这么来的,由于时间问题不跟大家作详细的推导啦,网上百度一下到处都有的。(附个链接:可以随便看看,讲的挺好的)
基于KKT条件,不等式约束条件的问题基本也就解决了,下面来说说我自己的一点心得吧!
第一点:拉格朗日乘子法求解优化问题是很有效的方法,对于限制条件比较多的情况下,特别是限制条件较为复杂的情况下,利用该方法可以很容易的求解出来。
第二点:约束条件其实就是限定了问题的解决范围,学会如何转化和考量限制条件是解决问题的关键。
第三点:基础知识的重要性,比如说高数如果学不好的话,在KKT条件的推导过程中,会遇到很多痛苦(对于数学基础不好的我感触尤深 = =)。
就这样啦,第一次博客,问题挺多的,后面再加强!!!