首页 > 其他分享 >最优化问题的KKT条件

最优化问题的KKT条件

时间:2024-08-26 18:26:23浏览次数:6  
标签:求解 KKT 条件 问题 梯度 最优化 lambda

最优化问题的KKT条件

大家好,我是小新,今天给大家带来一期KKT条件的讲解

文章目录


前言

hello!大家好,提到最优化问题大家都会感觉到非常头疼,最优化问题广泛存在于各个领域,如运筹学、经济学、工程学、计算机科学等领域中,最优化问题(Optimization Problem)是数学和计算机科学中常见的一类问题,其目标是在给定的约束条件下,找到某个函数的最大值或最小值。这个函数通常被称为目标函数(Objective Function),而约束条件则限制了可能的解空间,说的简单点就是给定约束条件通过一定的算法,求解对应的最优化问题的过程。(比如优化校园垃圾桶的配置问题),那么最优化问题一共有哪几种呢?
请添加图片描述


一、最优化问题分类

我大致把最优化问题整理为以下几类:

  • 线性最优化问题:目标函数和约束条件都是线性的。这类问题可以使用线性规划(Linear Programming, LP)等方法求解。
  • 非线性最优化问题:目标函数或约束条件中至少有一个是非线性的。这类问题通常更难求解,可能需要使用迭代方法、启发式算法等。
  • 整数最优化问题:解必须是整数。这类问题通常被称为整数规划(Integer Programming, IP),包括纯整数规划、混合整数规划等。这类规划问题通常需要引入约束条件或者用到剪枝才能得到最优解。
  • 动态最优化问题:问题涉及到时间序列或随时间变化的状态。这类问题可以使用动态规划(Dynamic Programming, DP)等思想求解。
  • 组合最优化问题:解是离散的,通常涉及到数据结构中的集合、图等结构。这类问题包括旅行商问题(Traveling Salesman Problem, TSP)、图着色问题(Graph Coloring Problem)等。
  • 随机最优化问题:问题中涉及到随机性,如随机变量、概率分布等。这类问题可以使用随机规划(Stochastic Programming)、随机优化算法等求解。

二、常见求解步骤

既然有这么多种最优化问题,那么一定有每一种问题的求解方案,不可能每个问题都是NP完全问题,就如我上面提到的解决方法一样,但是最常见的方法无非就是四类:

  • 梯度下降法:梯度下降法是一种用于求解无约束最优化问题的迭代优化算法,它通过不断迭代更新参数以最小化目标函数。这种方法特别适用于机器学习和深度学习中模型参数的优化,以最小化损失函数或成本函数。(注意是无约束!!!)

梯度下降法的扩展:

1.批量梯度下降法(Batch Gradient Descent, BGD):

就如它的名字一样,每次批量就是全部样本用于梯度下降中,这种方式虽然说比较全面但是挺浪费时间的。

 2.随机梯度下降法(Stochastic Gradient Descent, SGD)

每次固定抽取一个样本进行梯度下降训练,很明显每次可能抽到相同的样本,可能很不具有代表性。

 3.小批量梯度下降法(Mini-batch Gradient Descent, MBGD)

每次抽取一小部分进行梯度下降训练,这种方法用的最多,虽然有震荡,但是仍会趋于全局最小值。

  • 拉格朗日乘子法:拉格朗日乘子法用来求解问题时与梯度下降法有所不同,它能够有效处理带约束最优化类问题,但是如果是不等式约束条件的话不太适用。

  • KKT条件:KKT条件(Karush-Kuhn-Tucker conditions)是在数学优化问题中用来寻找非线性规划问题最优解的一组必要条件。这些条件适用于带有不等式约束和等式约束的优化问题。当问题满足某些假设(如约束的可行性、目标函数和约束函数的可微性以及某些正则性条件)时,KKT条件可以提供局部最优解的必要条件。

  • 序列二次规划:序列二次规划(Sequential Quadratic Programming, SQP)是一种用于求解非线性约束优化问题的有效方法。它通过将原问题转化为一系列二次规划(Quadratic Programming, QP)子问题来迭代求解。在每一步迭代中,SQP算法解决一个或多个QP子问题,以逐步逼近原问题的最优解。序列二次规划的核心思想是利用问题中的函数和约束的某种近似迭代法,尤其是利用约束函数的线性近似。这种方法特别适用于利用Newton法求解Lagrange函数的稳定点,因此也被称为Lagrange-Newton法。


三、KKT条件解析

今天就来给大家介绍一下上面适用于不等式约束条件线性最优化问题的KKT条件,它们可以看作是拉格朗日乘数法的一种扩展。

首先KKT条件的一般形式为:
m i n i m i z e a f ( x ) minimize\phantom{a} f(x) minimizeaf(x)

s u b j e c t a t o a a a g i ( x ) ≤ 0 , i = 1 , … , m subject \phantom{a} to \phantom{aaa} g_i(x)≤0,i=1,…,m subjectatoaaagi​(x)≤0,i=1,…,m

h j ( x ) = 0 , j = 1 , … , p h_j(x)=0,j=1,…,p hj​(x)=0,j=1,…,p

这里 f ( x ) 是目标函数, g i ( x ) 是不等式约束, h j ( x ) 是等式约束。 这里 f(x)是目标函数,gi(x) 是不等式约束,hj(x)是等式约束。 这里f(x)是目标函数,gi(x)是不等式约束,hj(x)是等式约束。
对于上述问题,KKT条件包含以下几个部分:

1.原问题的梯度:对于目标函数的梯度应与所有活动约束的梯度形成线性组合。

2.拉格朗日乘子:存在一组拉格朗日乘子 λ i ≥ 0 和 μ j λi≥0 和 μ_j λi≥0和μj​使得
∇ f ( x ∗ ) + ∑ i = 1 m λ i ∇ g i ( x ∗ ) + ∑ j = 1 p μ j ∇ h j ( x ∗ ) = 0 \nabla f(x^*) + \sum_{i=1}^{m} \lambda_i \nabla g_i(x^*) + \sum_{j=1}^{p} \mu_j \nabla h_j(x^*) = 0 ∇f(x∗)+i=1∑m​λi​∇gi​(x∗)+j=1∑p​μj​∇hj​(x∗)=0
3.约束满足性:所有约束必须在候选解 x ∗ x^∗ x∗处满足
g i ( x ∗ ) ≤ 0 , i = 1 , … , m and h j ( x ∗ ) = 0 , j = 1 , … , p g_i(x^*) \leq 0, \quad i = 1, \ldots, m \quad \text{and} \quad h_j(x^*) = 0, \quad j = 1, \ldots, p gi​(x∗)≤0,i=1,…,mandhj​(x∗)=0,j=1,…,p

4.互补松弛性:对于每个不等式约束,如果约束活跃 ( 即 g i ( x ∗ ) = 0 ) (即gi(x^∗)=0) (即gi(x∗)=0),那么对应的拉格朗日乘子 λ i λ_i λi​必须非负;如果约束非活跃,则拉格朗日乘子为0。
λ i ≥ 0 , i = 1 , … , m \lambda_i \geq 0, \quad i = 1, \ldots, m λi​≥0,i=1,…,m

λ i g i ( x ) = 0 , i = 1 , … , m \lambda_i g_i(x) = 0, \quad i = 1, \ldots, m λi​gi​(x)=0,i=1,…,m

5.对偶可行性:拉格朗日乘子 μ j μ_j μj​
对应于不等式约束必须是非负的:
μ j > = 0 μ_j>=0 μj​>=0


四、解析优化类问题

说到这里可能大家还是不是太理解,给大家举个例子:
对于我们自己定义的一个最优化问题:
m i n i m i z e a x 1 2 + x 2 2 minimize\phantom{a} x_{1}^{2}+x_{2}^{2} minimizeax12​+x22​

s u b j e c t a t o a a a x 1 + x 2 < = 1 subject \phantom{a} to \phantom{aaa} x_{1}+x_{2}<=1 subjectatoaaax1​+x2​<=1

x 1 , x 2 > = 0 x_{1},x_{2}>=0 x1​,x2​>=0

解决步骤

  1. 构造拉格朗日函数(引入拉格朗日乘子):
    L ( x 1 , x 2 , λ ) = x 1 2 + x 2 2 + λ ( 1 − x 1 − x 2 ) L(x_{1},x_{2},\lambda) = x_{1}^{2}+x_{2}^{2}+\lambda(1-x_{1}-x_{2}) L(x1​,x2​,λ)=x12​+x22​+λ(1−x1​−x2​)
    2.很明显这个问题需要用KKT条件求解,因为属于不等式最优化问题,所以我们引入KKT条件:
    求偏导数并设为0:
    ∂ L ∂ x 1 = 2 x 1 − λ \frac{\partial L}{\partial x_{1}} = 2x_{1} - \lambda ∂x1​∂L​=2x1​−λ

∂ L ∂ x 2 = 2 x 2 − λ \frac{\partial L}{\partial x_{2}} = 2x_{2} - \lambda ∂x2​∂L​=2x2​−λ
3.约束条件:
x 1 + x 2 < = 1 x_{1}+x_{2}<=1 x1​+x2​<=1
x 1 > = 0 x_{1}>=0 x1​>=0
x 2 > = 0 x_{2}>=0 x2​>=0
4.补充松弛性条件:
λ > = 0 \lambda >=0 λ>=0
λ ( 1 − x 1 − x 2 ) \lambda(1-x_{1}-x_{2}) λ(1−x1​−x2​)

方程和约束条件确定完毕后,就需要我们来求解了,从梯度条件解出
x 1 = x 2 = λ / 2 x_{1} = x_{2} = \lambda/2 x1​=x2​=λ/2
,求解之后需要做到以下两点:

  1. 检查约束条件:根据约束条件,确定哪些变量可能处于边界上。

  2. 验证补充松弛性:确定哪些约束是活跃的,哪些是非活跃的。

五、实现过程

用python代码实现:

import numpy as np
from scipy.optimize import minimize, NonlinearConstraint
from sympy import symbols, diff, solve, Eq

# 定义符号变量(自行定义)
x = symbols('x')
lambda_ = symbols('lambda')

# 定义目标函数(自行定义)
def objective(x):
    return x[0]**2

# 定义不等式约束(自行定义)
def constraint(x):
    return x[0] - 1

# 构造拉格朗日函数(根据题意构造)
L = x**2 - lambda_ * (x - 1)

# 计算L关于x的梯度
grad_L_x = diff(L, x)

# 计算L关于lambda的梯度(即对偶可行性条件)
grad_L_lambda = diff(L, lambda_)

# 求解梯度条件和原始/对偶可行性条件
solution = solve((Eq(grad_L_x, 0), Eq(constraint(x), 0)), (x, lambda_))

print("Symbolic solution:", solution)

# 使用Scipy求解
# 定义不等式约束
constraint = NonlinearConstraint(constraint, -np.inf, 0)

# 初始猜测值
x0 = np.array([0])

# 进行优化
res = minimize(objective, x0, constraints=constraint)

print("O最优化结果为:", res)

用matlab代码实现:

% 清除变量
clear all

% 定义符号变量
syms x lambda

% 定义目标函数
f = x^2;

% 定义等式和不等式约束
g = x - 1;

% 构造拉格朗日函数
L = f - lambda*g;

% 计算L关于x的梯度
grad_L_x = diff(L, x);

% 计算L关于lambda的梯度(即对偶可行性条件)
grad_L_lambda = diff(L, lambda);

% 求解梯度条件和原始/对偶可行性条件
solution = solve([grad_L_x == 0, g <= 0, lambda >= 0], [x, lambda]);

% 显示解
disp(solution)

总结

看到这里了想必大家已经会用KKT条件求解带有不等式的最优化问题了,以上内容就是今天要讲的内容了,主要介绍了KKT条件和最优化理论,之后我会继续更新这方面的内容,大家如果感兴趣的话,如果有想看的内容,请在评论区告诉我!,别忘了给UP主一个关注,你的关注是我更新的动力!!!

请添加图片描述

标签:求解,KKT,条件,问题,梯度,最优化,lambda
From: https://blog.csdn.net/2301_79387165/article/details/141567402

相关文章

  • 网站提示412 Precondition Failed:服务器未满足请求的先决条件怎么办
    当遇到“412PreconditionFailed”错误时,这意味着服务器没有满足客户端在请求中设置的一个或多个先决条件。这种错误通常与HTTP请求中的条件控制头字段(如 If-Unmodified-Since, If-Match, If-None-Match 等)有关。解决方案检查条件控制头确认请求中是否包含了条件控制......
  • 网站提示428 Precondition Required:必须在请求中设置先决条件怎么办
    当遇到“428PreconditionRequired”错误时,这意味着服务器要求客户端在请求中包含特定的先决条件(precondition)。这种错误通常出现在客户端尝试执行某项操作时,服务器需要确认某些条件得到满足。解决方案检查请求头确认请求头中是否包含了服务器要求的先决条件。例如,服务器......
  • Kubernetes前提条件准备
    环境条件升级内核修改内核参数配置cgroup安装CRI内核参数配置网络流量转发cat<<EOF|sudotee/etc/modules-load.d/k8s.confoverlaybr_netfilterEOF 启用模块modprobeoverlaymodprobebr_netfilter 调整内核参数net.ipv4.ip_forward......
  • Java基础学习篇:switch条件语句进阶(最详细版)
    ......
  • 云渲染的三个条件是指什么!哪三点最重要!
    云渲染技术以其灵活性和效率,让创意人士和企业无论身处何地,都能通过网络接入强大的远程服务器,轻松完成复杂的图形渲染任务,但要发挥其魔力,我们得满足一些关键条件。一、网络连接:云渲染的桥梁首先,高速且稳定的网络连接是云渲染成功的基石。想象一下,如果网络连接时断时续,你的渲染任......
  • mysql - 根据某经纬度 从区域列表内筛选符合条件的区域. 地图经纬度 坐标筛选
    作者原创.转载请注明来源我有一个区域列表.每个区域都有一堆经纬度坐标集合它们组成一个不规则图形.然后我有个经纬度坐标想筛选出这个坐标属于那个区域.mysql适合做这样的筛选吗?//创建区域坐标表CREATETABLEregions( idINTAUTO_INCREMENTPRIMARYKEY,......
  • 倾向性得分匹配后,如何快速开展条件logistic回归?
    倾向得分匹配法是通过对样本建模(logit模型)得到倾向性得分,通过倾向性得分为试验组在对照组中找到最接近的样本,从而进行研究的。倾向得分匹配在真实世界临床研究用途越来越广泛,它是一种事后推动组间比较均衡化的方法,控制混杂偏倚。那么匹配完了后,应该用什么方法呢?观察性......
  • 竞争条件入门
    早些时间了解了竞争条件这个有趣的现象,底层原理不细讲,可以看看网上pwncollege的搬运这里还是简单描述下众所周知,CPU从逻辑上是逐条指令执行的,但是当多个进程运行的时候,就会让他们的指令交叉进行操作,如果两个进程对同一文件进行操作时,就有可能导致两个程序对其读取时的环......
  • 条件概率和黎曼和
    设共有\(n\)个人,放弃前\(k\)个人,若按此策略最终选到最优的人的概率为\(P(k)\),则\[\begin{aligned}P(k)&=P(\text{第}(k+1)\text{个人是最优的})+P(\text{第}(k+2)\text{个人是最优的}+\cdots+P(\text{第}n\text{个人是最优的})\\&=\frac1n+\frac1n\cdot\frack{k+1......
  • C++多线程详解 | 线程创建 | 互斥锁 | 条件变量 | 线程池
    目录前言1.线程创建2.互斥锁3.lock_guard与std::unique_lock4.condition_variable 5.线程池前言在说线程之前,先说说进程和线程的关系,以及什么是多线程(为了方便理解就用大白话来说)进程:进程就是运行中的程序,比如说一个微信的程序,你双击它,它运行起来了就是一个进程,在还......