目录
1 核心思想
核心思想:SVM(Support Vector Machine)的基本思想是通过寻找一个超平面(在二维空间中为一条直线,三维空间中为一个平面,以此类推)来对训练数据进行划分。这个超平面被称为“决策边界”或“分隔超平面”,它能够最大化两个类别之间的间隔(margin)。位于间隔边界上的数据点被称为“支持向量”(support vector),它们在决定分类超平面时起着关键作用。
2 原理
2.1 支持向量
在SVM中,只有一小部分数据点(即支持向量)对决策超平面的位置起到决定性作用。这些支持向量是距离决策超平面最近的训练数据点。在求解优化问题的过程中,只有支持向量对应的拉格朗日乘子不为零,而其他数据点对应的拉格朗日乘子为零。因此,我们只需要保留支持向量和对应的拉格朗日乘子,就可以对新的数据样本进行分类。
2.2 软间隔与硬间隔
在SVM中,有两种间隔方式:硬间隔和软间隔。
硬间隔要求所有的数据点都被正确地分类,并且距离决策超平面的距离大于等于某个常数(即间隔)。然而,在实际应用中,数据往往不是完全线性可分的,或者存在噪声和异常值。这时,我们可以使用软间隔SVM,允许一些数据点被错误分类,但是要尽可能地减少错误分类的数量。软间隔可以通过引入松弛变量和惩罚系数来实现。
2.3 线性可分情况:
假设我们有一个线性可分的二分类问题,其中数据点用 xi 表示,其对应的标签为 。我们的目标是找到一个超平面 ,使得对于所有 的点,有,对于所有 的点,有 。
为了找到这个最优的超平面,我们需要最大化间隔 d,间隔可以表示为 (其中 w 是超平面的法向量,b 是截距)。同时,我们需要满足约束条件 yi(w⋅xi+b)≥1,这个约束条件确保了所有的数据点都被正确地分类。
因此,我们可以将问题转化为求解以下的优化问题:
这是一个凸二次规划问题,可以通过拉格朗日乘子法求解。
2.4 线性不可分情况:
当数据不是线性可分时,我们可以使用核函数将数据映射到一个高维空间,使得数据在高维空间中变得线性可分。常用的核函数包括线性核、多项式核、径向基函数(RBF)核等。
在引入核函数后,我们需要求解的优化问题变为:
其中,ϕ(x) 是将原始数据映射到高维空间的函数(即核函数),ξi 是松弛变量,用于处理异常值或噪声数据,C 是惩罚系数,用于平衡分类错误和间隔最大化。
2.5 核函数(Kernel Function)
2.5.1定义
支持向量机通过某非线性变换φ(x),将输入空间映射到高维特征空间。如果支持向量机的求解只用到内积运算,并且存在某个函数K(x, x′),使得K(x, x′)等于高维空间中这个内积,即K(x, x′) = φ(x) ⋅ φ(x′),那么支持向量机就可以直接使用这个函数K(x, x′)来得到非线性变换的内积,从而大大简化了计算。这样的函数K(x, x′)就被称为核函数。
常见的核函数包括线性核函数、多项式核函数、高斯核函数(也称为径向基函数RBF)、Sigmoid核函数等。这些核函数在不同的数据集和问题上有各自的优势和局限性,选择合适的核函数是支持向量机和其他核方法性能的关键。
其中,高斯核函数是最常用的核函数之一,它可以将数据映射到无穷维,具有非常强大的非线性处理能力。多项式核函数能够表示原始特征的高阶组合,适用于非线性可分的数据。线性核函数则没有映射到高维空间,保持数据的原始形态。
2.5.2 核函数分类
- 线性核函数(Linear Kernel):线性核函数是最简单的核函数,它不进行任何映射,仅仅计算原始特征空间中的内积。其数学表示形式为K(x, y) = x·y,其中x和y表示原始特征空间中的两个向量。
- 多项式核函数(Polynomial Kernel):多项式核函数通过将特征空间映射到更高维度的空间,使得原始数据在新的空间中变得线性可分。多项式核函数可以捕捉输入数据之间的非线性关系。
- 高斯核函数(Gaussian Kernel):高斯核函数是最常用的核函数之一,也称为径向基函数(Radial Basis Function,简称RBF)。它可以将数据映射到无穷维的特征空间,并适用于各种类型的数据。高斯核函数通常具有一个超参数,用于控制函数的宽度或“尺度”,从而影响模型的复杂度和泛化能力。
- 拉普拉斯核函数(Laplacian Kernel):拉普拉斯核函数是一种基于拉普拉斯分布的核函数,与高斯核函数类似,它也能够将数据映射到无限维的特征空间,实现对非线性数据的线性分类。
2.5.3 高斯核函数
高斯核函数(Gaussian Kernel Function),也称为径向基(RBF)函数,是一种常用的核函数,用于计算两个样本之间的相似性。它通常被定义为空间中任意一点到某一中心点之间的欧式距离的单调函数。
高斯核函数的数学公式有多种表达方式,但通常可以写作:
其中,x和y是输入空间中的两个向量,σ是核函数的宽度参数(也称为标准差),‖x−y‖表示x和y之间的欧几里得距离的平方。exp表示指数函数。
高斯核函数具有以下性质:
- 对称性:K(x, y) = K(y, x),即交换x和y的位置,函数的值不变。
- 正定性:K(x, x) > 0,即对于任意向量x,高斯核函数的值总是大于0。
- 局部性:高斯核函数是局部的,即当x和y之间的距离增加时,函数的值会迅速减小。这意味着高斯核函数主要关注于输入向量之间的局部相似性。
2.5 公式推导
SVM(支持向量机)的公式推导过程涉及多个步骤,主要用于解决分类问题。以下是SVM公式推导的详细过程:
-
列出原始目标函数和约束条件:
- 目标函数:目标是最大化间隔,这等价于最小化参数向量w的L2范数(即w的模的平方)。因此,目标函数可以表示为 。
- 约束条件:对于每一个数据点 (xi,yi),其中 xi 是特征向量,yi 是对应的标签(通常取值为-1或1),都需要满足 yi(w⋅xi+b)≥1。这个不等式确保了数据点被正确地分类,并且距离决策边界有一定的距离(即间隔)。
-
表达式化简:
- 利用约束条件 yi(w⋅xi+b)≥1,可以推导出数据点到超平面的距离的最小值。这个最小值实际上就是间隔的一半(因为约束条件中的1是间隔的两倍)。
- 通过将目标函数中的w与x无关项提取出来,并利用约束条件进行推导,可以得到一个关于w和b的表达式,该表达式描述了间隔的大小。
-
转化为二次规划问题:
- 将目标函数 和约束条件 yi(w⋅xi+b)≥1 一起考虑,可以将问题转化为一个二次规划问题。二次规划问题是一类特殊的优化问题,其目标函数是二次的,约束条件是线性的。
- 在这个二次规划问题中,需要找到一组参数w和b,使得目标函数最小,同时满足所有的约束条件。
-
求解二次规划问题:
- 求解这个二次规划问题,可以得到最优的参数w和b。这些参数定义了最优的超平面,用于对新的数据点进行分类。
- 求解二次规划问题的方法有多种,包括拉格朗日乘子法、序列最小优化算法(SMO)等。
-
引入核函数(可选):
- 如果数据不是线性可分的,可以通过引入核函数将数据映射到一个高维空间,使得数据在高维空间中变得线性可分。核函数的选择对于SVM的性能至关重要。
- 在引入核函数后,需要修改目标函数和约束条件,以适应高维空间中的数据。然后重新求解这个新的二次规划问题。
通过以上步骤,可以推导出SVM的公式,并用于解决分类问题。需要注意的是,以上推导过程是基于硬间隔SVM的。对于软间隔SVM(即允许一些数据点被错误分类的SVM),还需要在目标函数中添加一个惩罚项来平衡分类错误和间隔最大化。
3 API
3.1 SVC
类
SVC
是 sklearn.svm
模块下用于分类的SVM实现
3.1.1 基本用法
from sklearn import svm
clf = svm.SVC(kernel='linear', C=1.0, gamma='scale')
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)
3.1.2 参数详解
kernel
: 指定SVM的核函数,可选值有'linear'
,'poly'
,'rbf'
,'sigmoid'
,'precomputed'
。默认是'rbf'
(径向基函数)。C
: 错误项的惩罚参数C,用于控制模型的复杂度与数据拟合之间的平衡。默认是1.0。gamma
: 对于'rbf'
,'poly'
和'sigmoid'
类型的核函数,这是一个系数。对于'scale'
,它的值是1 / (n_features * X.var())
。默认是'scale'
。degree
: 对于'poly'
类型的核函数,这是多项式的次数。默认是3。coef0
: 对于'poly'
和'sigmoid'
类型的核函数,这是独立的项,在多项式核和Sigmoid核中作为常数项。默认是0。tol
: 停止训练的标准差,默认是1e-3。max_iter
: 最大迭代次数,对于'newton-cg'
,'sag'
和'lbfgs'
求解器,默认是-1(无限制)。decision_function_shape
: 可以是'ovo'
或'ovr'
,用于多类分类问题。默认是'ovr'
(一对一)。
3.1.3 方法详解
fit(X, y)
: 使用给定的训练数据X和标签y来训练SVM模型。predict(X)
: 使用训练好的模型来预测新数据X的标签。predict_proba(X)
: 对于二分类问题,返回每个类别的概率估计。对于多分类问题,返回每个样本属于每个类别的概率估计。score(X, y)
: 返回给定测试数据和标签上的平均准确率。
3.2 NuSVC
和 LinearSVC
NuSVC
: 与SVC
类似,但使用参数nu
来控制错误项的上界和支持向量的百分比,而不是使用参数C
。LinearSVC
: 用于线性可分的数据的SVM,它的实现基于liblinear库,可以处理大规模数据集。对于非线性问题,可以使用SVC
并设置kernel='linear'
,但LinearSVC
在处理大规模数据集时可能更高效。
3.3 SVR
类
对于回归问题,sklearn
提供了 SVR
类,它与 SVC
类似,但用于回归任务。其参数和方法与 SVC
类似,但有一些特定的回归相关参数。
4 优缺点
4.1 优点:
- 高效性:SVM通过支持向量来构建决策边界,这通常只需要一小部分训练数据(即支持向量)。因此,SVM的计算复杂度并不直接依赖于整个训练数据集的大小,而是取决于支持向量的数量,这在处理大规模数据集时非常有效。
- 泛化能力强:由于SVM的目标是找到最大化分类边际的超平面,这使得SVM在分类问题中具有较好的泛化能力,即对于未见过的数据也能做出较准确的预测。
- 适用于高维数据:SVM通过使用核函数,可以在高维空间中有效地工作,避免了在高维空间中直接计算内积的复杂性。
- 鲁棒性强:SVM对噪声数据和缺失数据具有较好的鲁棒性,因为它主要依赖于支持向量来构建决策边界。
4.2 缺点:
- 对参数敏感:SVM的性能在很大程度上取决于其参数的选择,如惩罚参数C和核函数参数(如RBF核的γ)。这些参数需要通过交叉验证等方法进行调优,否则可能会导致模型性能下降。
- 计算复杂度高:虽然SVM的计算复杂度不直接依赖于整个训练数据集的大小,但它在训练过程中需要计算每对样本之间的内积(或使用核函数),这在大规模数据集上可能会导致计算成本较高。
- 对数据的预处理要求高:SVM对数据的缩放和标准化等预处理步骤非常敏感。如果数据没有进行适当的预处理,可能会导致SVM的性能下降。
- 难以处理多类问题:原始的SVM算法是为二分类问题设计的。对于多类问题,通常需要使用一些策略(如一对多、一对一等)来扩展SVM,但这些策略可能会增加计算的复杂性和模型的复杂性。
- 对非线性问题的处理需要核函数:虽然SVM可以通过使用核函数来处理非线性问题,但选择合适的核函数并确定其参数可能是一项具有挑战性的任务。不同的核函数和参数选择可能会对模型的性能产生显著影响。
5 代码实现
# 导入必要的库
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集(Iris dataset)
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化(对于很多SVM核函数来说,标准化是一个好习惯)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 创建SVM分类器实例,这里我们使用径向基函数(RBF)作为核函数
clf = SVC(kernel='rbf', C=1.0, gamma='scale')
# 训练模型
clf.fit(X_train_scaled, y_train)
# 使用模型进行预测
y_pred = clf.predict(X_test_scaled)
# 评估模型的准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# 如果需要,你还可以输出其他指标,如混淆矩阵、分类报告等
在这个例子中,我们首先加载了鸢尾花数据集,并将其划分为训练集和测试集。然后,我们使用StandardScaler
对数据进行标准化处理,因为对于SVM来说,特征之间的尺度差异可能会影响结果。接下来,我们创建了一个SVC
分类器实例,并指定了使用RBF核函数。之后,我们用训练数据拟合模型,并对测试集进行预测。最后,我们计算并输出了模型的准确率。