凸优化--对偶问题 for SVM

http://www.hanlongfei.com/convex/2015/11/05/duality/?from=timeline


为啥要最大化?

用上面的x+3y例子  确实是应该求最大 为啥呢?


可以理解为,如果最小值是4,那么他确实是大于等于2的,但是2肯定不是要求的最小值;再进行试探,是否大于等于3,大于等于4?最后发现符合约束的最大的数字就到4了,就说明,4是要找的最小值了呗。


这又是什么神操作?  u,b,v,h都是常数  另外为什么只有v限制小于等于零,因为u无论正负,chengzaiy一个等式左右,并无什么影响,v只有是正的,才能使小于等于号变成大于等于号,是最后结果变成一个大于等于,才可以利用之前讨论的对偶形式。

但是突然发现,我这是认为v应该大于等于零,可是实际竟然是小于等于零???绝对写错了!!


下文中就写了大于等于零





一个线性函数ax+b,如果a不为0,那么这个函数的最小值为负无穷?对呀 ,x可以取值负无穷到正无穷的一条直线的最小值,可不就是负无穷



跟KKT条件有什么关系?

### 关于支持向量机中的凸二次规划问题 在支持向量机(SVM)中,优化目标函数可以被表述为一个凸二次规划(Convex Quadratic Programming, CQP)问题。该问题的目标是在高维空间中找到最优超平面,使得不同类别的数据点能够被尽可能清晰地区分开来。 #### 凸二次规划问题的形式化描述 对于线性可分的支持向量机而言,原始最优化问题是寻找满足特定约束条件下的最小权重平方和: \[ \min_{w,b} \frac{1}{2}\| w \| ^2 \] 其中 \(w\) 是权值向量而 \(b\) 则表示偏置项。为了处理非严格线性可分的情况以及引入核技巧扩展到更高维度的空间内工作,通常会转换成拉格朗日对偶形式求解[^1]。 此时原问题转化为其对应的对偶问题——即最大化如下表达式的值: \[ L_D=\sum_i^n{\alpha_i}-\frac{1}{2}\sum_i^n\sum_j^n y^{(i)}y^{(j)}K(x^{(i)},x^{(j)})\alpha_i\alpha_j \] 这里 \(α_i≥0\) 表示拉格朗日乘子;\(y^{(i)}∈{-1,+1}\) 代表类别标签;\(K(\cdot,\cdot)\) 定义了两个输入实例之间的相似度测量方式(也称为核函数),它允许模型通过映射至特征空间实现更复杂的决策边界构建。 #### 解决方法:序列最小优化(SMO) 由于直接应用通用的二次规划算法效率低下,因此提出了专门针对此类问题设计的方法—序列最小优化 (Sequential Minimal Optimization, SMO)。此技术的核心思想在于每次只更新一对参数而不是整个变量集,在每一步迭代过程中选择合适的样本来简化计算过程并加速收敛速度。 具体来说,SMO 将大规模 QP 问题分解成了多个小型子问题来进行逐个击破。这些子问题具有解析解可以直接得出而不必依赖数值逼近手段,从而大大提高了整体运算性能。 ```python def smo_algorithm(X, Y, C, tol, max_passes, kernel_func): m, n = X.shape alphas = np.zeros(m) b = 0 passes = 0 while passes < max_passes: num_changed_alphas = 0 for i in range(m): Ei = calc_E(w=calc_w(alphas, X, Y), dataMatrix=X, classLabels=Y, i=i) - Y[i] if ((Y[i]*Ei < -tol and alphas[i] < C) or (Y[i]*Ei > tol and alphas[i] > 0)): j = select_Jrand(i, m) Ej = calc_E(w=calc_w(alphas, X, Y), dataMatrix=X, classLabels=Y, i=j) alpha_Iold = alphas[i].copy() alpha_Jold = alphas[j].copy() L, H = clip_alpha(alphas[i], alphas[j], Y[i], Y[j]) if L==H: continue eta = 2.0 * X[i,:]*X[j,:].T - X[i,:]*X[i,:].T - X[j,:]*X[j,:].T if eta >= 0: continue alphas[j] -= float(Y[j]*(Ei - Ej))/eta alphas[j] = adjust_alpha(alphas[j], L, H) if abs(alphas[j]-alpha_Jold)<0.00001: continue alphas[i] += Y[j]*Y[i]*(alpha_Jold-alphas[j]) b = update_b(b, Ei, Ej, alphas[i], alphas[j], alpha_Iold, alpha_Jold, Y[i], Y[j], X[i,:], X[j,:]) num_changed_alphas += 1 if num_changed_alphas == 0: passes += 1 else: passes = 0 return alphas, b ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值