支持向量机(Support Vector Machine,简称SVM)是一种强大的机器学习算法,广泛应用于分类和回归问题中。本文将聚焦于SVM的核心原理,特别是核函数变换与最大间隔分类策略。
SVM的基本思想是在特征空间中找到一个最优的分类超平面,使得该超平面能够尽可能地将两类样本分开,并且两类样本到这个超平面的距离(即间隔)最大。这种策略被称为最大间隔分类。
设训练集为$\{(x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n)\}$,其中$x_i$为样本特征,$y_i$为标签(取值为1或-1)。线性可分情况下,分类超平面可以表示为:
$w \cdot x + b = 0$
其中,$w$是超平面的法向量,$b$是偏置项。为了找到最优分类超平面,需要解决以下优化问题:
$\min_{w, b} \frac{1}{2}||w||^2$ $s.t. \quad y_i(w \cdot x_i + b) \geq 1, \quad i = 1, 2, \ldots, n$
通过求解这个凸优化问题,可以找到最优的$w$和$b$,从而确定最优分类超平面。
然而,在实际应用中,很多数据是线性不可分的。为了处理这类问题,SVM引入了核函数变换。核函数能够将原始特征空间中的数据映射到一个高维特征空间,使得在这个高维空间中数据变得线性可分。
设$\phi(x)$是将输入数据$x$映射到高维空间的函数,则分类超平面可以表示为:
$\phi(w) \cdot \phi(x) + b = 0$
为了求解优化问题,SVM利用核函数$K(x_i, x_j)$来避免直接计算$\phi(x)$。核函数满足:
$K(x_i, x_j) = \phi(x_i) \cdot \phi(x_j)$
常见的核函数包括线性核、多项式核、径向基函数(RBF)核等。通过选择合适的核函数和参数,SVM能够处理复杂的非线性分类问题。
以下是一个使用Python和scikit-learn库实现SVM分类的示例代码:
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 加载示例数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两个特征进行可视化
y = iris.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建SVM分类器,使用RBF核
clf = svm.SVC(kernel='rbf', gamma='scale')
clf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = clf.predict(X_test)
# 可视化分类结果
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('SVM with RBF kernel')
plt.show()
这段代码展示了如何使用SVM进行分类,并通过可视化展示了分类结果。在实际应用中,可以根据数据的特点选择合适的核函数和参数。
支持向量机是一种强大的机器学习算法,其核心原理包括最大间隔分类和核函数变换。通过这两个策略,SVM能够处理线性可分和线性不可分的分类问题。在实际应用中,SVM广泛应用于文本分类、图像识别、生物信息学等领域,并取得了良好的效果。