# 软间隔

讨论软间隔是因为像这种情况，严格分出来（线性不可分了已经，用核函数可以分）是个弯曲的，但实际上应该就是这下面这样一条斜线才是最好的模型表示：

![](/files/-LpJXFdmaVV9yBhNueAk)

因此办法是，允许在一些情况下出现错误，引入软间隔的概念，在这个软间隔内允许出错。也就是允许不满足约束：

$$
y\_i(w^Tx\_i+b) \ge 1
$$

对于不满足的点，我们会累记一个损失函数，再引入惩罚力度因子C，则可以重新定义优化目标，L为损失函数：

$$
\begin{aligned}
\&min\_{w,b}\frac{1}{2}||w||^2+C\sum\_{i=1}^NL(y\_i(w^Tx\_i+b)-1)\\
\&L\_{0/1}(z)=\begin{cases}1,z<0,\0,z\ge0 \end{cases}\\
\&L\_{hinge}(z)=max(0,1-z),L\_{exp}(z)=exp(-z),L\_{log}(z)=log(1+exp(-z))
\end{aligned}
$$

**松弛变量**

显然，`这些损失是常数且>=0`，因此引入松弛变量的概念替换原来的损失函数计算结果，重写简化：

$$
\begin{aligned}
\&min\_{w,b}\frac{1}{2}||w||^2+C\sum\_{i=1}^N \xi\_i\\
\&s.t. y\_i(w^Tx\_i+b) \ge 1 - \xi \\
& \xi \ge0,i=1,2..,N
\end{aligned}
$$

同样的进行拉格朗日变换，变为：

$$
min\_{w,b}\frac{1}{2}||w||^2+C\sum\_{i=1}^N \xi\_i-\sum\_{i=1}^{N}\alpha\_i\[y\_i(w^T\_i+b)-1+\xi\_i]-\sum\_{i=1}^{N}\mu\_i\xi\_i
$$

和以前一样的对偶，转为对极大值函数的极小问题，也就是先函数对w、b求导取极小值，最终得到如下对偶问题：

$$
\begin{aligned}
\&max\_{\alpha}\sum\_{i=1}^{N}\alpha\_i-\frac{1}{2}\sum\_{i=1}^{N}\sum\_{j=1}^{N}\alpha\_i\alpha\_jy\_iy\_jx\_i^Tx\_j\\
\&s.t. \sum\_{i=1}^{N}\alpha\_iy\_i=0,(\mu\_i \ge 0,C=\alpha\_i+\mu\_i)\\
& 0 \le \alpha\_i \le C ,i=1,2,...,N
\end{aligned}
$$

**KKT约束**

可见，与非软间隔的问题相比，仅仅是对约束ai多了一个上界约束，且约束就是ai<惩罚因子C。然后同样SMO解得参数就可以得到模型f(x)了，同样因为存在不等式约束约束，所以这里模型f(x)有KKT条件约束：

$$
s.t.\begin{cases}
\alpha\_i \ge0,\mu\_i \ge 0 \\
y\_i(w^T x\_i+b)-1+\xi\_i \ge 0 \\
\alpha\_i(y\_i(w^Tx\_i+b)-1+\xi\_i)=0\\
\xi\_i \ge0,\mu\_i\xi\_i =0
\end{cases}
$$

这个约束是有道理的，（方便后面`SMO迭代求解`的时候进行选择）：

**a)** 如果$$\alpha\_i=0$$,那么$$\mu\_i=C,(C=\alpha\_i+\xi\_i)$$,那么必定$$\xi\_i=0$$,则：$$y\_i(w^Tx\_i+b)-1\ge0$$,即样本在几何间隔边界上或者已经被正确分类（映射到间隔边那边很远，任意处都是正确分类）。

**b)** 如果$$0<\alpha\_i\<C$$,那么$$\mu\ne 0 \to \xi\_i=0$$,则：$$,y\_i(w^Tx\_i+b)-1=0$$,即点刚好在几何间隔边界上。

**c)** 如果$$\alpha\_i=C \to \mu\_i=0 \to \xi\_i$$ =任意数 ，说明这是一个可能比较异常的点，需要检查此时ξi

> 1\)如果0≤ξi≤1,那么点被正确分类，但是却在超平面和自己类别的间隔边界之间 2)如果ξi=1,那么点在分离超平面上，无法被正确分类。 3)如果ξi>1,那么点在超平面的另一侧，也就是说，这个点不能被正常分类

```python
   def _KKT(self, i):
        y_g = self._g(i) * self.Y[i]

        if self.alpha[i] == 0:#a=0:需要yif(xi)-1>=0
            return y_g >= 1
        elif 0 < self.alpha[i] < self.C: #0<a<C:需要在边界上yif(xi)=1
            return y_g == 1
        else:
            return y_g <= 1    #a>=C:异常点,需要0≤ξi≤1满足在区间内yif(xi)<=1
```

## SMO

有了以上铺垫，我们可以开始探索怎么求解SVM了


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://im-qianuxn.gitbook.io/pytorch/ji-suan-ji/ml/7-zhi-chi-xiang-liang/svm-ruan-jian-ge.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
