04 支持向量机(SVM)

支持向量机(SVM)详解及应用:分类与回归

支持向量机(SVM)是一种强大的监督学习算法,广泛用于分类和回归任务。SVM 通过找到最优的超平面来区分不同类别,或者在回归任务中进行精确预测。本文将详细介绍 SVM 的基本理论,并提供分类和回归任务的代码示例,以帮助你深入理解 SVM 的应用。

1、支持向量机的基本原理

(1)分类任务

在分类问题中,SVM 的目标是找到一个最佳的超平面,将数据分成不同的类别。这个超平面使得两类数据点之间的间隔最大化,从而提高分类的准确性。SVM 的基本思想是通过最大化间隔来提高模型的泛化能力。

数学基础:

SVM 分类问题可以用以下优化问题来描述:

min ⁡ w , b 1 2 ∥ w ∥ 2 \min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 w,bmin21w2

受约束条件:

y i ( w ⋅ x i + b ) ≥ 1 y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(wxi+b)1

其中,(\mathbf{w}) 是超平面的法向量,(b) 是偏置项,(\mathbf{x}_i) 是特征向量,(y_i) 是标签(+1 或 -1)。

(2)回归任务

支持向量回归(SVR)是 SVM 的一种扩展,用于处理回归问题。SVR 的目标是找到一个回归函数,该函数能够在允许的误差范围内最佳地拟合数据。

数学基础:

SVR 的优化问题可以表示为:

min ⁡ w , b , ξ , ξ ∗ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ( ξ i + ξ i ∗ ) \min_{\mathbf{w}, b, \xi, \xi^*} \frac{1}{2} \|\mathbf{w}\|^2 + C \sum_{i=1}^n (\xi_i + \xi_i^*) w,b,ξ,ξmin21w2+Ci=1n(ξi+ξi)

受约束条件:

y i − ( w ⋅ x i + b ) ≤ ϵ + ξ i y_i - (\mathbf{w} \cdot \mathbf{x}_i + b) \leq \epsilon + \xi_i yi(wxi+b)ϵ+ξi
( w ⋅ x i + b ) − y i ≤ ϵ + ξ i ∗ (\mathbf{w} \cdot \mathbf{x}_i + b) - y_i \leq \epsilon + \xi_i^* (wxi+b)yiϵ+ξi
ξ i , ξ i ∗ ≥ 0 \xi_i, \xi_i^* \geq 0 ξi,ξi0

其中,(\xi_i) 和 (\xi_i^*) 是松弛变量,(\epsilon) 是容忍度,(C) 是正则化参数。

2、SVM 分类任务代码示例

我们将使用 scikit-learn 库中的 SVC 进行分类任务。以下代码演示了如何使用支持向量机进行分类,并绘制决策边界。

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
from sklearn.metrics import classification_report, confusion_matrix

# 1. 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只选择前两个特征
y = iris.target

# 2. 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 3. 创建 SVM 模型
svm_model = SVC(kernel='rbf', C=1.0, gamma='scale')

# 4. 训练模型
svm_model.fit(X_train, y_train)

# 5. 预测
y_pred = svm_model.predict(X_test)

# 6. 评估模型
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

print("\nClassification Report:")
print(classification_report(y_test, y_pred))

# 7. 可视化
def plot_decision_boundaries(X, y, model, title="Decision Boundaries"):
    h = .02  # step size in the mesh
    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, h),
                         np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.3)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.title(title)
    plt.show()

plot_decision_boundaries(X, y, svm_model, title="SVM Decision Boundaries with RBF Kernel")

3、SVM 回归任务代码示例

接下来,我们使用 scikit-learn 中的 SVR 进行回归任务。以下代码演示了如何使用支持向量回归进行预测,并绘制回归结果。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVR
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# 1. 生成合成回归数据
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=42)

# 2. 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 3. 创建 SVR 模型
svr_model = SVR(kernel='rbf', C=100, epsilon=0.1)

# 4. 训练模型
svr_model.fit(X_train, y_train)

# 5. 预测
y_pred = svr_model.predict(X_test)

# 6. 评估模型
print("Mean Squared Error:", mean_squared_error(y_test, y_pred))
print("R^2 Score:", r2_score(y_test, y_pred))

# 7. 可视化
plt.scatter(X_test, y_test, color='darkorange', label='Data')
plt.plot(X_test, y_pred, color='navy', lw=2, label='SVR fit')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.title('Support Vector Regression')
plt.legend()
plt.show()

结论

支持向量机(SVM)是一种有效的分类和回归算法。对于分类任务,SVM 通过最大化类别间的间隔来进行优化,而在回归任务中,SVM 通过找到一个容忍误差的回归函数来进行预测。通过 scikit-learn 提供的 SVM 实现,我们可以方便地进行模型训练、预测和评估,并通过可视化工具直观地展示模型效果。希望本文的理论介绍和代码示例能帮助你更好地理解和应用 SVM。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值