[机器学习]svm支持向量机(介绍1)

506 阅读3分钟

支持向量机(SVM)详解

监督学习算法
适合中小规模样本,高维度数据,非线性,分类任务

超平面: 在高维空间里分隔数据的线性边界
支持向量: 距离超平面最近的样本点, 这些样本点决定了超平面的位置
间隔:支持向量到超平面的距离, svm算法的目标就是最大化这个间隔, 间隔越大, 则鲁棒性越好, 泛化能力越强.

在低维空间里是线性不可分的, 通过映射函数, 把数据映射到更高维空间内, 可能就变的线性可分了, 这正是SVM处理非线性问题的核心逻辑

是不是只要升高维度, 就一定会变的线性可分?

是的, 根据mercer定理, 如果升到**无限维**(如高斯核对应无限维空间),数据几乎总是可分的(由Mercer定理保证)

1. 算法概述

支持向量机(Support Vector Machine, SVM) 是一种监督学习算法,主要用于分类任务,尤其是二分类,也可用于回归。

其核心思想是找到一个最优超平面,最大化不同类别数据之间的间隔(称为“间隔最大化”)。

SVM 在小样本、高维数据和非线性分类问题中表现优异。


2. 原理解析

图片.png


3. 适用场景

  • 数据特点:中小规模、高维(如文本分类、图像识别)。

  • 问题类型

    • 二分类问题(可通过“一对一”或“一对多”扩展到多分类)。
    • 回归问题(使用支持向量回归,SVR)。
    • 非线性可分数据(需配合核函数)。

4. 可解决的问题

  • 分类:垃圾邮件检测、手写数字识别。
  • 回归:房价预测。
  • 异常检测:工业缺陷检测。

5. 优缺点

优点缺点
高维数据有效大规模数据训练慢
核技巧处理非线性问题对参数(C, γ)敏感(超参数, 可以通过网格搜索进行模型优化)
泛化能力强,避免过拟合需要特征缩放
依赖少数支持向量,内存效率高黑盒模型,解释性差

6. Python 代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 生成模拟数据
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 标准化数据
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 训练 SVM 模型(使用 RBF 核)
model = SVC(kernel='rbf', 
            C=1.0,  # 软间隔
            gamma='scale')
model.fit(X_train, y_train)

# 预测与评估
y_pred = model.predict(X_test)
print(f"准确率: {accuracy_score(y_test, y_pred):.2f}")
print(f"支持向量数量: {len(model.support_vectors_)}")

# 可视化决策边界
def plot_decision_boundary():
    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.02),
                         np.arange(y_min, y_max, 0.02))
    Z = model.predict(scaler.transform(np.c_[xx.ravel(), yy.ravel()]))
    Z = Z.reshape(xx.shape)
    
    plt.contourf(xx, yy, Z, alpha=0.4)
    plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolor='k', s=20)
    plt.title("SVM 决策边界 (RBF 核)")
    plt.show()

plot_decision_boundary()

输出结果:

准确率: 0.95
支持向量数量: 127

SVM Decision Boundary


代码解释

  1. 数据生成:使用 make_classification 创建二维可分数据。
  2. 标准化:SVM 对特征尺度敏感,需标准化。
  3. 模型训练:选择 RBF 核,调整 Cgamma 可优化性能。
  4. 可视化:绘制决策边界,直观展示分类效果。

通过调整参数(如 Cgamma 和核函数),可进一步优化模型表现。实际应用中,建议使用网格搜索(GridSearchCV)进行超参数调优。