支持向量机是一种用于分类和回归的强大机器学习算法,最常见的是用于二分类任务。SVM 的核心思想是通过找到一个最优超平面,将数据集划分成不同的类别。SVM 尤其擅长处理高维数据,且能在数据少的情况下提供较好的分类效果。
在 SVM 中,主要有几个核心概念:
在数据线性可分的情况下,支持向量机旨在找到一个超平面来将不同类别的数据完全分开,且间隔最大化。对于一个线性可分的数据集,我们可以用以下决策函数来表示:
其中, 是法向量, 是偏置。我们的目标是使得正负类样本点满足以下条件:
为了最大化间隔,我们要最小化 ,即解决以下优化问题:
同时满足约束条件:
这个优化问题可以通过 拉格朗日乘子法 转化为对偶问题,并使用 SMO 算法或其它优化算法求解。
在实际应用中,数据往往并非线性可分。为此,我们引入 软间隔(Soft Margin) 和 惩罚项,允许少量样本出现在错误的分类区域内。
优化问题变为:
其中, 是惩罚系数,平衡间隔最大化与分类错误之间的关系。
当数据在低维空间中不可分时,SVM 通过核函数将数据映射到更高维空间,在更高维度下寻找线性可分的超平面。常用的核函数包括:
核函数的作用是避免直接在高维空间中计算数据点的坐标,通过核技巧(Kernel Trick),可以在低维空间进行计算,降低计算复杂度。
SVM 的优化问题通常会通过 拉格朗日对偶 转换为对偶问题,从而简化求解过程。对于大规模数据集,SMO(Sequential Minimal Optimization) 是常用的优化算法,其基本思想是每次只优化两个变量,使得复杂的约束条件转换为二元约束问题,从而高效求解。
在 scikit-learn
中,SVM
算法使用 SVC
(支持向量分类)类实现,以下是基于 scikit-learn
的 SVC
类的代码示例:
- from sklearn import datasets
- from sklearn.model_selection import train_test_split
- from sklearn.svm import SVC
- import matplotlib.pyplot as plt
- import numpy as np
-
- # 加载数据集
- iris = datasets.load_iris()
- X = iris.data[:, :2] # 只取两个特征方便可视化
- y = iris.target
- y = y[y != 2] # 仅使用两类样本进行二分类
- X = X[y != 2]
-
- # 划分数据集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
-
- # 构建 SVM 模型
- clf = SVC(kernel='linear', C=1.0)
- clf.fit(X_train, y_train)
-
- # 打印支持向量
- print("支持向量:", clf.support_vectors_)
-
- # 预测测试集
- y_pred = clf.predict(X_test)
-
- # 可视化决策边界
- def plot_decision_boundary(clf, X, y):
- x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
- y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
- xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
- np.arange(y_min, y_max, 0.01))
- Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
- Z = Z.reshape(xx.shape)
- plt.contourf(xx, yy, Z, alpha=0.8)
- plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
- plt.xlabel('Feature 1')
- plt.ylabel('Feature 2')
- plt.title('SVM Decision Boundary')
- plt.show()
-
- plot_decision_boundary(clf, X, y)
scikit-learn
的 SVC
类是对 libsvm
的封装,核心参数和方法包括:
'linear'
、'poly'
、'rbf'
、'sigmoid'
等。 在 fit
方法中,scikit-learn
会调用 libsvm
的训练接口,根据给定的数据和参数进行支持向量求解,通过 SMO 或其他优化算法找到最优解。
SVM 适用于高维数据集和样本量较小的数据集。在文本分类、人脸识别、生物信息学等领域,SVM 都得到了广泛应用。
SVM 是一种强大的分类算法,适用于高维和小样本数据。其主要思想是找到一个最优超平面,最大化不同类别数据的间隔。通过软间隔和核函数,SVM 可以处理线性不可分数据。优化算法主要使用 SMO 或对偶问题求解。虽然 SVM 在分类效果上表现出色,但训练复杂度较高,对参数敏感。