支持向量机
概述
**支持向量机(Support Vector Machine,SVM)**是一种强大的监督学习算法,用于分类和回归任务。它在数据挖掘和机器学习领域具有广泛的应用。SVM 的基本思想是找到一个最优的超平面,将不同类别的数据点分开,从而实现分类或回归。
主要特点
- 最大间隔: SVM 的目标是找到一个能够最大化不同类别数据点之间间隔的超平面。这个间隔被称为“最大间隔”,通过最大化间隔可以使得分类器对未知数据具有更好的泛化能力。
- 支持向量: 在最大间隔的超平面上,距离两侧最近的数据点被称为“支持向量”。这些支持向量决定了最终的超平面位置,它们对分类器的决策起着关键作用。
- 核技巧: SVM 可以通过核函数将数据映射到高维空间,从而在非线性情况下实现更好的分类。这允许 SVM 在低维空间中处理非线性问题。
- 软间隔: 在实际问题中,数据很可能不是完全线性可分的。SVM 引入软间隔,允许一些数据点出现在错误的一侧,以提高模型的泛化性能。
- C 和 γ 参数: 在 SVM 中,C 和 γ 是两个关键参数。C 控制了分类器对分类错误的容忍度,γ 控制了核函数的影响范围。
线性可分支持向量机
**线性可分支持向量机(Linear Separable Support Vector Machine)**是指在训练数据中,存在一个超平面能够完全将不同类别的数据点分开,没有任何数据点位于超平面上或超平面两侧的错误分类区域。这种情况下,数据集被称为线性可分。
距离公式 $$ r = \frac{|wx+b|}{|w|} $$ 优化目标 $$ \begin{aligned} & \underset{x}{\text{minimize}} & & \frac{1}{2}||w||^2 \ & \text{subject to} & & y_i(w⋅x_i+b)\geqslant1 \end{aligned} $$
from sklearn.svm import SVC
# 创建硬间隔线性支持向量机
hard_svm = SVC(kernel='linear', C=1e10) # 设置C为一个大值
软间隔最大化
软间隔最大化是支持向量机(SVM)在处理线性不可分数据时引入的概念。在现实情况下,很少有数据能够完全被一个超平面分开。为了处理这种情况,SVM 引入了软间隔来允许一些数据点位于错误的一侧。
软间隔最大化的目标是在最大化间隔的同时,容忍一些错误分类。这通过引入松弛变量$\xi$来实现。 $$ \begin{aligned} & \underset{x}{\text{minimize}} & & \frac{1}{2}||w||^2+C\sum\xi_i \ & \text{subject to} & & y_i(w⋅x_i+b)\geqslant 1-\xi\ &&& \xi_i\geqslant 0 \end{aligned} $$
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = 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_classifier = SVC(kernel='linear')
svm_classifier.fit(X_train, y_train)
# 预测
y_pred = svm_classifier.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
非线性支持向量机
**非线性支持向量机(Nonlinear Support Vector Machine,SVM)**是一种通过引入核函数来处理非线性可分数据的方法。核函数允许在高维特征空间中进行非线性映射,从而在原始特征空间中的非线性问题变为高维特征空间中的线性问题,使得支持向量机可以用于更加复杂的数据。
核函数:
- 多项式核(Polynomial Kernel):
- 适用范围:多项式核函数将数据映射到高维空间并进行多项式扩展,可以处理一些简单的非线性关系。
- 公式:$K(x, y) = (x^T y + c)^d$
- 径向基函数核(RBF Kernel):
- 适用范围:径向基函数核函数使用高斯分布来进行映射,能够处理更为复杂的非线性问题。
- 公式:$K(x, y) = \exp(-\gamma |x - y|^2)$
- Sigmoid核:
- 适用范围:Sigmoid核函数可以进行双曲正切映射,适用于一些特殊的问题。
- 公式:$K(x, y) = \tanh(\alpha x^T y + c)$
from sklearn.svm import SVC
from sklearn.datasets import make_circles
import matplotlib.pyplot as plt
# 生成随机非线性数据
X, y = make_circles(n_samples=100, factor=0.3, noise=0.1)
# 创建非线性支持向量机,使用RBF核函数
nonlinear_svm = SVC(kernel='rbf', C=1.0, gamma=1.0)
# 拟合模型
nonlinear_svm.fit(X, y)
# 绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 100),
np.linspace(ylim[0], ylim[1], 100))
Z = nonlinear_svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
plt.scatter(nonlinear_svm.support_vectors_[:, 0], nonlinear_svm.support_vectors_[:, 1],
s=100, facecolors='none', edgecolors='k')
plt.title("Nonlinear SVM with RBF Kernel")
plt.show()