KKT条件和拉格朗日对偶

KKT条件是拉格朗日乘子法的泛化,利用KKT条件,既可以求解等式约束为题也可以求解不等式约束问题,而拉格朗日乘子法,只能处理等式约束问题,直接上KKT条件;

主要参考陈宝林《最优化理论与算法》,理个脉络出来。证明见原书。为了后面的svm说明,这里不上等式约束,个别符号也有变化。

(1) 要解决的问题:

min\ f(w) \\ s.t.\ g_{i}(w)\geqslant 0 , i = 1, 2, ...,m

 

(2) Fritz John条件

f,g_{i}w^{*}处可微,g_{i}w^{*}处连续,则

如果w^{*}是问题(1)的局部最优解,则存在\alpha_{0},\alpha_{i}\in \mathbb{R},使得:

\alpha_{0}\triangledown f(w^{*}) - \sum_{i}^{m} \alpha_{i}\triangledown g_{i}(w^{*}) = 0

 

(3) KKT条件

在Fritz John条件的前提中加入

\{\triangledown g_{i}(w^*)\}线性无关的条件,则

如果w^{*}是问题(1)的局部最优解,则存在\alpha_{i}\in \mathbb{R},使得:

\triangledown f(w^{*}) - \sum_{i}^{m} \alpha_{i}\triangledown g_{i}(w^{*}) = 0

\alpha_{i} g_{i}(w^{*}) = 0

\alpha_{i} \geqslant 0

 

(4)定义Lagrange函数

L(w,\alpha) = f(w) - \sum_{i}^{m} \alpha_{i}g_{i}(w)

则上述KKT条件可以写成:

如果w^{*}是问题(1)的局部最优解,则存在\alpha_{i}\in \mathbb{R},使得:

L(w^{*},\alpha) = 0

\alpha_{i} g_{i}(w^{*}) = 0

\alpha_{i} \geqslant 0

 

(5) KKT条件示例

后续补上。

 

拉格朗日对偶使用了

https://www.cnblogs.com/massquantity/p/10807311.html

比陈宝林书更好理解,而且能在SVM证明中顺畅使用,我做了点修改,如下:

 

(6)拉格朗日对偶

原始问题为:

min\ f(w) \\ s.t.\ g_{i}(w)\geqslant 0 , i = 1, 2, ...,m

其拉格朗日函数为:

L(w,\alpha) = f(w) - \sum_{i}^{m} \alpha_{i}g_{i}(w)

\alpha_{i} \geqslant 0

 

w违反了一些约束,既存在i使得g_{i}(w)< 0,则-max_{\alpha}(L(w, \alpha)) = \infty,于是有:

min_{w}max_{ \alpha}L(w, \alpha)\\ = min_{w}(f(w) - max_{ \alpha}(\sum_{i}^{m} \alpha_{i}g_{i}(x)))\\ = min_{w}(f(w) + \left\{\begin{matrix} 0,if \,w \, satisfied\,\, the \,constraints \\1 ,otherwise\end{matrix}\right.\\ = min_{w}f(w))

则原始问题就等价于:

min_{w}max_{ \alpha}L(w, \alpha)\\ s.t.\,\alpha_{i}\geqslant 0

其对偶问题定义为:

max_{ \alpha}min_{w}L(w, \alpha)\\ s.t.\,\alpha_{i}\geqslant 0

 

当满足强对偶条件时:


slater 条件: f(x)为凸函数,g(x)为凹函数 ,且可行域中至少有一点使不等式约束严格成立时,强对偶性成立,对偶问题等价于原始问题。


有:

min_{w}max_{ \alpha}L(w, \alpha)\,= max_{ \alpha}min_{w}L(w, \alpha)

 

且必须满足KKT条件:

互补松弛:\alpha_{i} g_{i}(w) = 0

原始问题可行性:g_{i}(w)\geqslant 0 , i = 1, 2, ...,m

对偶问题可行性:\alpha_{i}\geqslant 0

拉格朗日平稳性:\triangledown L(w, \alpha) = \triangledown f(w) - \sum_{i}^{m} \alpha_{i}\triangledown g_{i}(w) = 0

### 使用KKT条件拉格朗日乘数法求解SVM决策边界 #### 构造拉格朗日函数 为了将支持向量机(SVM)的原始优化问题转换成更易于解决的形式,可以通过引入拉格朗日乘子构建拉格朗日函数。对于带有不等式约束的支持向量机模型: \[ \min_{\mathbf{w},b} \frac{1}{2}\|\mathbf{w}\|^2 \] 受制于 \(y_i(\mathbf{w}^T\mathbf{x}_i+b)-1 \geq 0\) 对所有的样本点成立。 因此,对应的拉格朗日函数可表示为: \[ L(\mathbf{w}, b, \alpha)=\frac{1}{2}\|\mathbf{w}\|^{2}-\sum_{i=1}^{N} \alpha_{i}[y_{i}\left(\mathbf{w}^{T} \phi\left(\mathbf{x}_{i}\right)+b\right)-1] \][^4] 其中,\( \alpha_i \) 是与第 i 个训练样例关联的拉格朗日乘子,并且满足非负性条件 \( \alpha_i \geq 0 \)[^2]. #### 应用Karush-Kuhn-Tucker (KKT) 条件 利用 KKT 条件能够有效地找到最优解。具体来说,在最优点处应满足以下三个必要条件: - **互补松弛性**: 如果某个特定的不等式约束严格有效,则相应的拉格朗日乘子必然是零;反之亦然。 - **梯度消失定理**: 原始目标函数关于变量 w 偏置项 b 的导数应当等于零 - **可行性**: 所有初始给定的约束都需被遵守 这些条件共同作用下使得我们可以推导出最终的对偶形式以及 SVM 中重要的支撑向量概念[^1]. #### SMO算法实现细节 实际编程实践中通常会采用序列最小优化(Sequential Minimal Optimization, SMO)算法来简化计算过程。该方法的核心在于每次迭代过程中仅仅挑选一对拉格朗日乘子进行更新操作,而保持其余部分不变。这样做的好处是可以显著减少内存占用并加快收敛速度[^3]. ```python import numpy as np class SimpleSVM: def __init__(self, C=1.0, tol=1e-3, max_passes=5): self.C = C self.tol = tol self.max_passes = max_passes def fit(self, X, y): m, n = X.shape alphas = np.zeros(m) b = 0 passes = 0 while passes < self.max_passes: num_changed_alphas = 0 for i in range(m): Ei = self._predict(X[i]) - y[i] if ((y[i]*Ei < -self.tol and alphas[i] < self.C) or (y[i]*Ei > self.tol and alphas[i] > 0)): j = self.select_j(i, m) Ej = self._predict(X[j]) - y[j] alpha_i_old = alphas[i].copy() alpha_j_old = alphas[j].copy() # 计算L H if y[i] != y[j]: L = max(0, alphas[j] - alphas[i]) H = min(self.C, self.C + alphas[j] - alphas[i]) else: L = max(0, alphas[j] + alphas[i] - self.C) H = min(self.C, alphas[j] + alphas[i]) eta = 2 * np.dot(X[i], X[j]) - \ np.dot(X[i], X[i]) - np.dot(X[j], X[j]) if eta >= 0: continue alphas[j] -= y[j]*(Ei-Ej)/eta alphas[j] = self.clip_alpha(alphas[j], L, H) if abs(alphas[j]-alpha_j_old)<1e-5: continue alphas[i] += y[i]*y[j]*(alpha_j_old-alphas[j]) b1 = b - Ei-y[i]*(alphas[i]-alpha_i_old)*np.dot(X[i],X[i])-\ y[j]*(alphas[j]-alpha_j_old)*np.dot(X[i],X[j]) b2 = b - Ej-y[i]*(alphas[i]-alpha_i_old)*np.dot(X[i],X[j])-\ y[j]*(alphas[j]-alpha_j_old)*np.dot(X[j],X[j]) if 0<alphas[i]<self.C: b=b1 elif 0<alphas[j]<self.C: b=b2 else: b=(b1+b2)/2. num_changed_alphas+=1 if num_changed_alphas==0: passes+=1 else: passes=0 idxs=np.where((alphas>0)&(alphas<C))[0] self.support_vectors_=X[idxs] self.dual_coefs_=-y[idxs] self.intercept_=b-np.mean(y[idxs]*np.sum( alphas*y*X@support_vectors_.T,axis=1)) @staticmethod def clip_alpha(alpha,L,H): if alpha>H: return H elif alpha<L: return L else: return alpha def _predict(self,x): pred=np.sign(np.sum([a*y*np.dot(x,support_vector.T)\ for a,y,support_vector in zip(self.alphas, self.y_train, self.X_train)])+ self.b) return pred def predict(self,X_test): predictions=[self._predict(x) for x in X_test] return predictions ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值