支持向量机(Support Vector Machine,SVM)是一种高效的监督学习算法。它将实例映射为多维空间中的点,每个维度代表一个特征。SVM的核心目标是找到最优的分割线或超平面划分数据集。基于这个分割边界,算法即可对新样本进行准确分类。
一、寻找最优分割平面
在支持向量机(SVM)算法中,寻找最优分类平面是一个关键问题。具体来说,我们需要找到一个能够将两类数据点完美分离的超平面,并且这个超平面要使得两类样本点到该平面的最小距离(即几何间隔)最大化。
计算几何间隔的数学过程如下:
- 首先定义线性分类器的决策函数:f(x) = w·x + b
- 几何间隔γ的计算公式为:
- 我们的优化目标就是最大化最小的几何间隔:
1) 线性可分情况(硬间隔 SVM)
假设数据是线性可分的,SVM 的目标是找到一个超平面:
w⋅x+b=0
使得所有样本点满足:
yi(w⋅xi+b)≥1,∀i
其中:
w是权重向量,决定超平面的方向;
b是偏置项,决定超平面的位置;
yi∈{−1,+1}是类别标签;
支持向量是距离超平面最近的样本点(即满足 yi(w⋅xi+b)=1的点)。
优化目标:
w,bmin21∥w∥2
即最小化 ∥w∥,使得间隔(margin)最大化。
(2) 线性不可分情况(软间隔 SVM)
如果数据不是完全线性可分(有噪声或重叠),SVM 允许一些样本违反约束,引入松弛变量 ξi≥0:
yi(w⋅xi+b)≥1−ξi
优化目标变为:
w,bmin21∥w∥2+Ci=1∑nξi
其中:
C是惩罚参数,控制分类错误的容忍度(C越大,分类越严格)。
(3) 非线性 SVM(核技巧)
如果数据在原始空间线性不可分,可以使用核函数(Kernel)将数据映射到高维空间,使其线性可分。
常见核函数:
线性核:K(xi,xj)=xi⋅xj
多项式核:K(xi,xj)=(γxi⋅xj+r)d
高斯核(RBF):K(xi,xj)=exp(−γ∥xi−xj∥2)
Sigmoid 核:K(xi,xj)=tanh(γxi⋅xj+r)
核技巧的优势:
无需显式计算高维映射,直接在低维空间计算内积;
适用于复杂非线性分类问题。
硬间隔推导过程
步骤1:函数间隔与几何间隔的关系
定义函数间隔(Functional Margin):
几何间隔(Geometric Margin):
步骤2:尺度不变性的利用
观察到对(w,b)同比例缩放时,几何间隔不变:
因此可固定最小函数间隔为1:
此时所有样本满足:
步骤3:目标函数转化
原始目标转化为:
为方便优化,改为最小化∣∣w∣∣2(保持单调性且求导更简便):
(系数21仅为后续求导时消去常数项)
步骤4:引入约束条件
最终得到SVM的标准优化形式:
软间隔
在硬间隔 SVM 中,我们要求所有样本满足:
yi(w⋅xi+b)≥1,∀i
如果数据线性不可分(存在噪声或重叠),此约束无法成立。因此,引入松弛变量(Slack Variables) ξi≥0,放宽约束:
yi(w⋅xi+b)≥1−ξi
ξi=0:样本正确分类且位于间隔外或边界上。
0<ξi≤1:样本位于间隔内但分类正确。
ξi>1:样本被错误分类。
优化目标
软间隔 SVM 的优化问题结合了最大化间隔和最小化分类错误:
约束条件:
其中:
21∥w∥2:最大化间隔(与硬间隔相同)。
C∑ξi:惩罚分类错误,C是超参数,控制惩罚力度。
拉格朗日函数
引入拉格朗日乘子 αi≥0和 μi≥0,构造拉格朗日函数:
KKT 条件
对 w、b、ξi求偏导并令其为零:
对 w求导:
对 b求导:
对 ξi求导:
由于 μi≥0,可得:
对偶问题
将 KKT 条件代入拉格朗日函数,得到对偶问题:
约束条件:
支持向量分类
支持向量:对应 αi>0的样本。
若 0<αi<C,则 ξi=0,样本位于间隔边界上。
若 αi=C,则 ξi≥0,样本可能位于间隔内或被错误分类。
决策函数:
其中 b通过支持向量计算:
二、SVC类(python)
class sklearn.svm.SVC( *, C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', break_ties=False, random_state=None )
核心参数说明
参数 |
类型 |
默认值 |
说明 |
---|---|---|---|
|
float |
|
正则化参数,控制分类严格性(值越大,分类越严格)。 |
|
str |
|
核函数: |
|
int |
|
多项式核的阶数(仅当 |
|
float, str |
|
核函数系数( |
|
float |
|
核函数中的独立项(对 |
|
bool |
|
是否启用概率估计(启用后会降低训练速度)。 |
|
float |
|
优化算法的停止容差。 |
|
int |
|
最大迭代次数( |
|
str |
|
多分类策略: |
重要属性
训练后的 SVC
对象会包含以下属性:
属性 |
说明 |
---|---|
|
支持向量的坐标(形状: |
|
支持向量在训练样本中的索引。 |
|
每个类别的支持向量数量。 |
|
对偶问题的解(形状: |
|
决策函数中的偏置项(常数项)。 |
主要方法
方法 |
说明 |
---|---|
|
训练模型( |
|
返回预测的类别标签。 |
|
返回样本到超平面的距离(置信度)。 |
|
返回类别概率(需 |
|
返回模型在测试集上的准确率。 |
import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
data = pd.read_csv('spambase.csv')
x = data.iloc[:,:-1]
y = data.iloc[:,-1]
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0)
svm = SVC(kernel='linear',C=float('inf'))
svm.fit(x_train,y_train)
y_pred = svm.predict(x_test)
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_pred)
print(cm)