1.原始问题
假设是定义在上的连续可微函数(为什么要求连续可微呢,后面再说,这里不用多想),考虑约束最优化问题:
称为约束最优化问题的原始问题。
现在如果不考虑约束条件,原始问题就是:
因为假设其连续可微,利用高中的知识,对求导数,然后令导数为0,就可解出最优解,很easy. 那么,问题来了(呵呵。。。),偏偏有约束条件,好烦啊,要是能想办法把约束条件去掉就好了,bingo! 拉格朗日函数就是干这个的。
引进广义拉格朗日函数(generalized Lagrange function):
不要怕这个式子,也不要被拉格朗日这个高大上的名字给唬住了,让我们慢慢剖析!这里,是拉格朗日乘子(名字高大上,其实就是上面函数中的参数而已),特别要求.
现在,如果把看作是关于的函数,要求其最大值,即
再次注意是一个关于的函数,经过我们优化(不要管什么方法),就是确定的值使得取得最大值(此过程中把看做常量),确定了的值,就可以得到的最大值,因为已经确定,显然最大值就是只和有关的函数,定义这个函数为:
其中
下面通过是否满足约束条件两方面来分析这个函数:
考虑某个违反了原始的约束,即或者,那么:
注意中间的最大化式子就是确定的之后的结果,若,则令,如果,很容易取值使得
考虑满足原始的约束,则:,注意中间的最大化是确定的过程,就是个常量,常量的最大值显然是本身.
通过上面两条分析可以得出:
那么在满足约束条件下:
即与原始优化问题等价,所以常用代表原始问题,下标 P 表示原始问题,定义原始问题的最优值:
原始问题讨论就到这里,做一个总结:通过拉格朗日这位大神的办法重新定义一个无约束问题(大家都喜欢无拘无束),这个无约束问题等价于原来的约束优化问题,从而将约束问题无约束化!
2.对偶问题
定义关于的函数:
注意等式右边是关于的函数的最小化,确定以后,最小值就只与有关,所以是一个关于的函数.
考虑极大化,即
这就是原始问题的对偶问题,再把原始问题写出来:
形式上可以看出很对称,只不过原始问题是先固定中的,优化出参数,再优化最优,而对偶问题是先固定,优化出最优,然后再确定参数.
定义对偶问题的最优值:
3. 原始问题与对偶问题的关系
定理:若原始问题与对偶问题都有最优值,则
证明:对任意的和,有
即
由于原始问题与对偶问题都有最优值,所以
即
也就是说原始问题的最优值不小于对偶问题的最优值,但是我们要通过对偶问题来求解原始问题,就必须使得原始问题的最优值与对偶问题的最优值相等,于是可以得出下面的推论:
推论:设分别是原始问题和对偶问题的可行解,如果,那么分别是原始问题和对偶问题的最优解。
所以,当原始问题和对偶问题的最优值相等:时,可以用求解对偶问题来求解原始问题(当然是对偶问题求解比直接求解原始问题简单的情况下),但是到底满足什么样的条件才能使的呢,这就是下面要阐述的 KKT 条件
4. KKT 条件
定理:对于原始问题和对偶问题,假设函数和是凸函数,是仿射函数(即由一阶多项式构成的函数,f(x)=Ax + b, A是矩阵,x,b是向量);并且假设不等式约束是严格可行的,即存在,对所有有,则存在,使得是原始问题的最优解,是对偶问题的最优解,并且
定理:对于原始问题和对偶问题,假设函数和是凸函数,是仿射函数(即由一阶多项式构成的函数,f(x)=Ax + b, A是矩阵,x,b是向量);并且假设不等式约束是严格可行的,即存在,对所有有,则分别是原始问题和对偶问题的最优解的充分必要条件是满足下面的Karush-Kuhn-Tucker(KKT)条件:
关于KKT 条件的理解:前面三个条件是由解析函数的知识,对于各个变量的偏导数为0(这就解释了一开始为什么假设三个函数连续可微,如果不连续可微的话,这里的偏导数存不存在就不能保证),后面四个条件就是原始问题的约束条件以及拉格朗日乘子需要满足的约束。
特别注意当时,由KKT对偶互补条件可知:,这个知识点会在 SVM 的推导中用到.
5. 总结
一句话,某些条件下,把原始的约束问题通过拉格朗日函数转化为无约束问题,如果原始问题求解棘手,在满足KKT的条件下用求解对偶问题来代替求解原始问题,使得问题求解更加容易。
分享到:
相关推荐
新编的,计算方法用,拉格朗日(Lagrange)插值实验课上用到的
MATLAB文件如 `Lagrange.m` 很可能包含了一个函数,用于接受一组数据点并返回对应的拉格朗日插值多项式。其他文件如 `sy2_1_3_1.m`, `sy2_1_3_2.m`, `sy2_1_1.m`, `sy2_1_2.m`, `sy2_2_1.m` 可能包含了不同示例或者...
在提供的压缩包文件"lagrange"中,可能包含了一个MATLAB脚本或函数,实现了上述步骤,用于进行拉格朗日插值。你可以加载并运行这个文件,以便在自己的数据集上尝试拉格朗日插值。通过理解拉格朗日插值的基本原理和...
拉格朗日Lagrange插值法的matlab实现。给出一批离样点,做出一条通过这些点的光滑曲线,构造一个简单函数来近似。 本篇为Lagrange插值法,构造插值多项式。
两种拉格朗日插值方法的matlab编程
使用拉格朗日lagrange法进行插值,欢迎下载~
matlab语言实现拉格朗日插值多项式求解lagrange.m,设n个节点数据以数组x0, y0输入(注意Matlat 的数组下标从1 开始),m 个插值点以数组x 输入,输出数组y 为m 个插值
标准C语言编写的拉格朗日(Lagrange)和牛顿(Newton)插值函数。 VS2008,gcc编译通过
在本文中,我们将深入探讨如何基于MFC(Microsoft Foundation Classes)框架来绘制Lagrange插值曲线和Bezier曲线。这两种曲线在计算机图形学、工程计算和几何建模中都有着广泛的应用。 首先,让我们理解Lagrange...
在给定的`Lagrange.cpp`文件中,我们可以预期代码将实现上述步骤,可能包含以下部分: - 数据结构或数组用于存储数据点。 - 函数来计算拉格朗日基多项式。 - 主函数或其他函数,用于构建插值多项式并进行插值计算。 ...
### 拉格朗日对偶问题详解 #### 一、引言 在解决复杂的优化问题时,常常需要用到拉格朗日乘子法及其相关的理论工具。本文将深入探讨拉格朗日对偶问题的基本概念及其重要性,并通过具体实例进行讲解。 #### 二、...
而在构建SVM的过程中,涉及到一个关键的概念——拉格朗日对偶性(Lagrange Duality)。本文旨在深入探讨SVM中的拉格朗日对偶性的概念及其在求解SVM问题中的应用。 #### 拉格朗日对偶性基础 拉格朗日对偶性是在数学...
拉格朗日(Lagrange)计算方法是一种在数学中广泛应用的插值技术,主要用于通过已知的一组数据点来构建一个多项式函数,该函数能够通过这些数据点。在这个程序中,我们讨论的是如何使用C++编程语言实现这一算法。 ...
Lagrange插值是一种在离散数据点上构造连续函数的方法,它在数值分析和计算数学中具有广泛应用。本文将详细介绍如何使用C++编程语言,结合Microsoft Foundation Classes (MFC) 框架,在Visual Studio 2008环境下实现...
### 拉格朗日(Lagrange)插值研究 #### 一、拉格朗日插值原理 拉格朗日插值是一种基于已知数据点构建多项式的方法,用以近似未知函数的值。它在数学、工程学及计算机科学等领域有着广泛的应用。该方法的核心在于...