举个例子:
- 假设你想判断邮件是否是垃圾邮件,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)
- 做个垃圾邮件分类器
- 可视化决策边界的变化过程?
发表回复