支持向量机
支持向量机(SVM)就是在一堆数据里,找一条"最宽的分界线",把不同类别尽量分得又准又稳。
|------|------|------|---------|------|
| | 分类标准 | 核心思想 | 最优化目标 | 泛化能力 |
| 线性模型 | 决策边界 | 民主投票 | 点到直线距离和 | 一般 |
| SVM | 超平面 | 民主集中 | margin | 提升 |
什么是间隔
在 SVM 中,我们要找一个超平面:
让它 把两类样本分开,并且离两类最近的点尽可能远 。这个"最近距离"就是 间隔(margin)。
SVM硬间隔(Hard Margin)
特点
- 假设数据是完全线性可分的
- 不允许任何样本被分错
- 所有点都必须在"安全边界"之外

最优化目标
- 最大化间隔margin
- 最大化距离d(线性模型中相当于斜边,而SVM中相当于直角边)
- 点到直线的垂直距离
SVM软间隔(Soft Margin)
要解决的问题
- 异常值outlier
- 支持向量的选择
- 民主集中思想的弱化
允许少量犯错,加入容错值,引入松弛变量 ξ
优化目标
参数 C
-
C 大 :强烈惩罚错误、更接近硬间隔、容易过拟合
-
C 小:允许更多错误、间隔更大、泛化能力更强
非线性SVM:核技巧
线性核函数
线性核函数是最简单的核函数,它直接在输入特征空间中进行内积计算,不进行任何映射。
-
其中,
和
是样本点
-
线性核函数相当于没有映射,直接在原始特征空间中操作
多项式核函数
多项式核函数通过对输入样本进行多项式映射,将数据从原始空间映射到更高维度空间,在高维空间中可能能找到一个线性决策边界。(通过调整多项式的度数,可以控制映射的复杂度)
-
其中,ccc 是常数,ddd 是多项式的次数。
-
这种核函数允许在输入空间中进行多项式映射,产生更复杂的决策边界
高斯核函数(RBF函数、径向基函数)
高斯核函数是最常用的核函数之一,它能够将数据映射到无限维度的空间,从而可以非常灵活地处理复杂的非线性关系。高斯核的特点是其通过样本之间的"距离"来定义相似度,距离越近,相似度越高。
其中, 表示样本点
和
之间的欧几里得距离,σ是高斯核的宽度参数。
如何选择核函数
- 当特征多且接近样本数量,可直接选择线性核SVM
- 当特征数少,样本数正常,推荐选用高斯核函数
- 当特征数少,样本数很大,建议选择多项式核函数(不要让阶数过高,否则可能过拟合)
SVM解决回归任务
数据准备
python
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(666)
x = np.random.uniform(-3,3,size=100)
y = 0.5 * x**2 +x+2 +np.random.normal(0,1,size=100)
X = x.reshape(-1,1)
代码实现
python
from sklearn.svm import LinearSVR
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
# 线性回归
# epsilon:超参数,容忍误差
def StandarLinearSVR(epsilon=0.1):
return Pipeline([
("std_scaler",StandardScaler()),
("linearSVR",LinearSVR(epsilon=epsilon))
])
svr = StandarLinearSVR()
svr.fit(X,y)
y_predict = svr.predict(X)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
plt.show()

python
# 非线性回归任务
# epsilon:超参数,容忍误差
def StandarSVR(epsilon=0.1):
return Pipeline([
("std_scaler",StandardScaler()),
("SVR",SVR(kernel='rbf',epsilon=epsilon))
])
svr = StandarSVR()
svr.fit(X,y)
y_predict = svr.predict(X)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
plt.show()

SVM优缺点和适用条件
优点
- 高效处理非线性数据
- 良好的泛化能力(L2正则化特性)
- 解决分类(SVC)和回归(SVR)问题
- 稳定性(数据微小变化不会对超平面产生很大影响)
缺点
- 选择合适的核函数比较困难
- 大量内存需求(生成很多支持向量)
- 大数据集上训练时间长
- 难以解释
适用条件
- 小样本数据
- 非线性数据