KKT条件介绍
版权声明:本文为CSDN博主「johnnyconstantine」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/johnnyconstantine/article/details/46335763
KKT条件是解决最优化问题的时用到的一种方法。我们这里提到的最优化问题通常是指对于给定的某一函数,求其在指定作用域上的全局最小值。提到KKT条件一般会附带的提一下拉格朗日乘子。对学过高等数学的人来说比较拉格朗日乘子应该会有些印象。二者均是求解最优化问题的方法,不同之处在于应用的情形不同。
一般情况下,最优化问题会碰到一下三种情况:
(1)无约束条件
这是最简单的情况,解决方法通常是函数对变量求导,令求导函数等于0的点可能是极值点。将结果带回原函数进行验证即可。
(2)等式约束条件
设目标函数为f(x),约束条件为hk(x),形如
s.t. 表示subject to ,“受限于”的意思,l表示有l个约束条件。
则解决方法是消元法或者拉格朗日法。消元法比较简单不在赘述,拉格朗日法这里在提一下,因为后面提到的KKT条件是对拉格朗日乘子法的一种泛化。
定义拉格朗日函数F(x),
其中λk是各个约束条件的待定系数。
然后解变量的偏导方程:
如果有l个约束条件,就应该有l+1个方程。求出的方程组的解就可能是最优化值(高等数学中提到的极值),将结果带回原方程验证就可得到解。
至于为什么这么做可以求解最优化?*上给出了一个比较好的直观解释。
举个二维最优化的例子:
min f(x,y)
s.t. g(x,y) = c
这里画出z=f(x,y)的等高线(函数的等高线定义:二元函数z = f(x,y)在空间表示的是一张曲面,这个曲面与平面z = c的交线在xoy面上的投影曲线f(x,y)=c称为函数z=f(x,y)的一条登高线。):
绿线标出的是约束的点的轨迹。蓝线是的等高线。箭头表示斜率,和等高线的法线平行。从梯度的方向上来看,显然有。绿色的线是约束,也就是说,只要正好落在这条绿线上的点才可能是满足要求的点。如果没有这条约束,的最小值应该会落在最小那圈等高线内部的某一点上。而现在加上了约束,最小值点应该在哪里呢?显然应该是在的等高线正好和约束线相切的位置,因为如果只是相交意味着肯定还存在其它的等高线在该条等高线的内部或者外部,使得新的等高线与目标函数的交点的值更大或者更小,只有到等高线与目标函数的曲线相切的时候,可能取得最优值。
如果我们对约束也求梯度,则其梯度如图中绿色箭头所示。很容易看出来,要想让目标函数的等高线和约束相切,则他们切点的梯度一定在一条直线上。
即:∇f(x,y)=λ(∇g(x,y)-C)
其中λ可以是任何非0实数。
一旦求出λ的值,将其套入下式,易求在无约束极值和极值所对应的点。
这就是拉格朗日函数的由来。
(3)不等式约束条件
设目标函数f(x),不等式约束为g(x),有的教程还会添加上等式约束条件h(x)。此时的约束优化问题描述如下:
则我们定义不等式约束下的拉格朗日函数L,则L表达式为:
其中f(x)是原目标函数,hj(x)是第j个等式约束条件,λj是对应的约束系数,gk是不等式约束,uk是对应的约束系数。0
此时若要求解上述优化问题,必须满足下述条件(也是我们的求解条件):
这些求解条件就是KKT条件。(1)是对拉格朗日函数取极值时候带来的一个必要条件,(2)是拉格朗日系数约束(同等式情况),(3)是不等式约束情况,(4)是互补松弛条件,(5)、(6)是原约束条件。
对于一般的任意问题而言,KKT条件是使一组解成为最优解的必要条件,当原问题是凸问题的时候,KKT条件也是充分条件。
关于条件(3),后面一篇博客中给出的解释是:我们构造L(x,λ,u)函数,是希望L(x,λ,u)<=f(x)的(min表示求最小值)。在L(x,λ,u)表达式中第二项为0,若使得第三项小于等于0就必须使得系数u>=0,这也就是条件(3)。
关于条件(4),直观的解释可以这么看:要求得L(x,λ,u)的最小值一定是三个公式项中取得最小值,此时第三项最小就是等于0值的时候。稍微正式一点的解释,是由松弛变量推导而来。
为方便表示,举个简单的例子:
现有如下不等式约束优化问题:
此时引入松弛变量可以将不等式约束变成等式约束。设a1和b1为两个松弛变量,则上述的不等式约束可写为:
则该问题的拉格朗日函数为:
根据拉格朗日乘子法,求解方程组:
则
同样 u2b1=0,来分析g2(x)起作用和不起作用约束。
于是推出条件:
KKT条件介绍完毕。
————————————————
版权声明:本文为CSDN博主「johnnyconstantine」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/johnnyconstantine/article/details/46335763
上一篇: RxJava条件操作符
下一篇: 用两个栈实现队列
推荐阅读
-
KKT条件介绍
-
RxJava条件操作符
-
链接文件命令(说了限制条件) 博客分类: 操作系统 LinuxWindows
-
Weka开发[8]- weka中算法说明 weka算法算法介绍大全
-
关于开发中的虚拟机介绍 博客分类: Java互联网 虚拟机互联网javajsp
-
链接文件命令(说了限制条件) 博客分类: 操作系统 LinuxWindows
-
串行规则执行器rules-executor 博客分类: java 规则执行器串行规则执行器过滤型规则条件型规则
-
Apache Zeppelin介绍&安装
-
[C/C++]_[初级]_[std::priority_queue的介绍]
-
YARN 各种RPC通信协议及它们的作用介绍 博客分类: Hadoop Hadoop