举个例子:

  • 假设你想判断邮件是否是垃圾邮件,SVM 就会在垃圾邮件和正常邮件之间画一条“间隔最大”的分界线。

📐 图像理解(以二维为例)

              ● 正类
     超平面→ ─────────────
              ○ 负类

SVM 就是找出这条线(或高维空间的超平面)使得:

  • 分类正确 ✅
  • 离边界最近的数据点(叫支持向量)也尽可能远 🚀

🔍 数学直觉

超平面方程:

w · x + b = 0

SVM 的目标是最大化间隔(Margin):

间隔 = 2 / ||w||


🎯 线性可分 vs 非线性可分

  • 线性可分数据:用一条直线/超平面就能分好。
  • 非线性可分数据:需要用**核函数(Kernel Trick)**将数据映射到更高维空间进行线性分割。

常用核函数:

核函数应用场景
线性核线性可分,特征不多
多项式核特征间存在多项式关系
RBF 高斯核非线性数据,通用型最强

✅ 用 Python 实现 SVM(使用 scikit-learn

示例:用 SVM 分类鸢尾花数据

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 加载数据
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 只取两类做二分类
X = X[y != 2]
y = y[y != 2]

# 降维方便画图
X_pca = PCA(n_components=2).fit_transform(X)

# 划分数据
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.3)

# 建模:使用线性核
clf = SVC(kernel='linear')
clf.fit(X_train, y_train)

# 预测和评估
print("准确率:", clf.score(X_test, y_test))

# 可视化
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='coolwarm', label='训练数据')
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap='coolwarm', marker='x', label='测试数据')
plt.title("SVM 分类图(降维后)")
plt.legend()
plt.show()


📈 SVM 优缺点

✅ 优点❌ 缺点
分类效果好,尤其在小样本和高维空间中对数据规模敏感(大数据训练慢)
支持非线性分类(核函数)对参数(C 和 γ)较敏感,需要调优
抗过拟合能力强不适合噪声多的数据

🛠 SVM 常见参数(调优重点)

参数说明
C惩罚参数,越大越不允许错误分类
kernel核函数类型(’linear’, ‘rbf’, ‘poly’)
gamma核函数的宽度,影响决策边界的曲率

🧪 适用场景

  • 图像识别(人脸 vs 非人脸)
  • 文本分类(垃圾邮件 vs 正常邮件)
  • 医疗诊断(肿瘤良恶性)
  • 金融风控(客户违约预测)

想不想试试用 SVM 来做个实际项目?比如:

  • 用手写数字识别(SVM + MNIST)
  • 做个垃圾邮件分类器
  • 可视化决策边界的变化过程?