支持向量机(Support Vector Machine,SVM)是一种强大的监督学习算法,广泛应用于分类和回归任务。它的核心思想是在特征空间中找到一个最优的超平面,使得不同类别的样本能够被最大程度地分开。在本文中,我们将详细介绍支持向量机的代码实现,通过具体的例子帮助大家更好地理解和应用这一算法。
在二分类问题中,支持向量机的目标是找到一个超平面 (w^T x + b = 0),使得不同类别的样本到该超平面的间隔最大。间隔可以定义为两类样本中离超平面最近的样本到超平面的距离之和。为了求解这个最优超平面,我们通常会将问题转化为一个凸二次规划问题:
(\min_{w,b} \frac{1}{2} |w|^2)
(y_i (w^T x_i + b) \geq 1, \quad i = 1,2,\cdots,n)
其中,(w) 是超平面的法向量,(b) 是偏置项,(x_i) 是第 (i) 个样本,(y_i \in {-1, +1}) 是第 (i) 个样本的标签。
Scikit-learn 是一个强大的机器学习库,提供了支持向量机的多种实现。下面是一个简单的二分类示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两个特征
y = iris.target
y = (y!= 0) * 1 # 将问题转化为二分类问题
# 划分训练集和测试集
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')
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = np.mean(y_pred == y_test)
print(f"Accuracy: {accuracy}")
# 可视化决策边界
plt.figure(figsize=(10, 6))
plt.scatter(X[:, 0], X[:, 1], c=y, 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=['--', '-', '--'])
# 绘制支持向量
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, facecolors='none', edgecolors='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('SVM Decision Boundary')
plt.show()
SVC
类创建一个线性核的支持向量机分类器,并使用训练集进行训练。在实际应用中,很多问题并不是线性可分的。这时,我们可以使用核技巧将数据映射到高维空间,使得数据在高维空间中线性可分。Scikit-learn 提供了多种核函数,如线性核、多项式核、径向基核(RBF)等。下面是一个使用径向基核的示例:
# 创建 SVM 分类器,使用径向基核
clf_rbf = SVC(kernel='rbf')
# 训练模型
clf_rbf.fit(X_train, y_train)
# 预测测试集
y_pred_rbf = clf_rbf.predict(X_test)
# 计算准确率
accuracy_rbf = np.mean(y_pred_rbf == y_test)
print(f"Accuracy with RBF kernel: {accuracy_rbf}")
特点 | 描述 |
---|---|
优点 | 高维空间处理能力强、泛化能力强、核技巧灵活 |
缺点 | 计算复杂度高、参数调优困难 |
支持向量机是一种非常强大的机器学习算法,在分类和回归任务中都有广泛的应用。通过本文的代码实现,我们可以看到使用 Python 和 Scikit-learn 库可以方便地实现支持向量机。同时,我们也了解了支持向量机的优缺点和适用场景。在实际应用中,我们需要根据具体问题选择合适的核函数和参数,以获得最佳的性能。