赞
踩
目录
核心思想:SVM(Support Vector Machine)的基本思想是通过寻找一个超平面(在二维空间中为一条直线,三维空间中为一个平面,以此类推)来对训练数据进行划分。这个超平面被称为“决策边界”或“分隔超平面”,它能够最大化两个类别之间的间隔(margin)。位于间隔边界上的数据点被称为“支持向量”(support vector),它们在决定分类超平面时起着关键作用。
在SVM中,只有一小部分数据点(即支持向量)对决策超平面的位置起到决定性作用。这些支持向量是距离决策超平面最近的训练数据点。在求解优化问题的过程中,只有支持向量对应的拉格朗日乘子不为零,而其他数据点对应的拉格朗日乘子为零。因此,我们只需要保留支持向量和对应的拉格朗日乘子,就可以对新的数据样本进行分类。
在SVM中,有两种间隔方式:硬间隔和软间隔。
硬间隔要求所有的数据点都被正确地分类,并且距离决策超平面的距离大于等于某个常数(即间隔)。然而,在实际应用中,数据往往不是完全线性可分的,或者存在噪声和异常值。这时,我们可以使用软间隔SVM,允许一些数据点被错误分类,但是要尽可能地减少错误分类的数量。软间隔可以通过引入松弛变量和惩罚系数来实现。
假设我们有一个线性可分的二分类问题,其中数据点用 xi 表示,其对应的标签为 。我们的目标是找到一个超平面 ,使得对于所有 的点,有,对于所有 的点,有 。
为了找到这个最优的超平面,我们需要最大化间隔 d,间隔可以表示为 (其中 w 是超平面的法向量,b 是截距)。同时,我们需要满足约束条件 yi(w⋅xi+b)≥1,这个约束条件确保了所有的数据点都被正确地分类。
因此,我们可以将问题转化为求解以下的优化问题:
这是一个凸二次规划问题,可以通过拉格朗日乘子法求解。
当数据不是线性可分时,我们可以使用核函数将数据映射到一个高维空间,使得数据在高维空间中变得线性可分。常用的核函数包括线性核、多项式核、径向基函数(RBF)核等。
在引入核函数后,我们需要求解的优化问题变为:
其中,ϕ(x) 是将原始数据映射到高维空间的函数(即核函数),ξi 是松弛变量,用于处理异常值或噪声数据,C 是惩罚系数,用于平衡分类错误和间隔最大化。
支持向量机通过某非线性变换φ(x),将输入空间映射到高维特征空间。如果支持向量机的求解只用到内积运算,并且存在某个函数K(x, x′),使得K(x, x′)等于高维空间中这个内积,即K(x, x′) = φ(x) ⋅ φ(x′),那么支持向量机就可以直接使用这个函数K(x, x′)来得到非线性变换的内积,从而大大简化了计算。这样的函数K(x, x′)就被称为核函数。
常见的核函数包括线性核函数、多项式核函数、高斯核函数(也称为径向基函数RBF)、Sigmoid核函数等。这些核函数在不同的数据集和问题上有各自的优势和局限性,选择合适的核函数是支持向量机和其他核方法性能的关键。
其中,高斯核函数是最常用的核函数之一,它可以将数据映射到无穷维,具有非常强大的非线性处理能力。多项式核函数能够表示原始特征的高阶组合,适用于非线性可分的数据。线性核函数则没有映射到高维空间,保持数据的原始形态。
高斯核函数(Gaussian Kernel Function),也称为径向基(RBF)函数,是一种常用的核函数,用于计算两个样本之间的相似性。它通常被定义为空间中任意一点到某一中心点之间的欧式距离的单调函数。
高斯核函数的数学公式有多种表达方式,但通常可以写作:
其中,x和y是输入空间中的两个向量,σ是核函数的宽度参数(也称为标准差),‖x−y‖表示x和y之间的欧几里得距离的平方。exp表示指数函数。
高斯核函数具有以下性质:
SVM(支持向量机)的公式推导过程涉及多个步骤,主要用于解决分类问题。以下是SVM公式推导的详细过程:
列出原始目标函数和约束条件:
表达式化简:
转化为二次规划问题:
求解二次规划问题:
引入核函数(可选):
通过以上步骤,可以推导出SVM的公式,并用于解决分类问题。需要注意的是,以上推导过程是基于硬间隔SVM的。对于软间隔SVM(即允许一些数据点被错误分类的SVM),还需要在目标函数中添加一个惩罚项来平衡分类错误和间隔最大化。
SVC
类SVC
是 sklearn.svm
模块下用于分类的SVM实现
- 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)
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'
(一对一)。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
类似,但有一些特定的回归相关参数。
- # 导入必要的库
- 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核函数。之后,我们用训练数据拟合模型,并对测试集进行预测。最后,我们计算并输出了模型的准确率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。