# 支持向量机(SVM)算法
# 直观理解
想象你是一个画家,需要在一张画布上画一条线,将红色和蓝色的点完美地分开。这就是SVM要解决的问题!
你会怎么画这条线呢?
- 首先,你希望这条线能正确分开所有点
- 其次,你希望线和最近的点之间的距离尽可能大
- 如果点不能用一条直线分开,你可能需要用曲线
这就是SVM的核心思想:找到最优的分隔线(超平面),使得不同类别的数据点之间的间隔最大。
# 算法原理
# 基本概念(以画线分类为例)
- 分隔线(超平面):就像画布上的一条线,将不同颜色的点分开
- 支持向量:离分隔线最近的点,它们就像是撑起这条线的支柱
- 间隔:分隔线到最近点的距离,就像是安全区域
- 核技巧:当无法用直线分开时,就像把平面图画变成立体图
# 算法流程
# 数学原理
# 线性可分SVM
对于线性可分问题,最优超平面的数学表达式:
原始优化问题:
约束条件:
# 对偶问题推导
引入拉格朗日乘子 ,构造拉格朗日函数:
对偶问题:
约束条件:
# 软间隔SVM
引入松弛变量 处理非线性可分问题:
约束条件:
其中C为惩罚参数,控制模型对误分类的容忍程度。
# 核函数
通过核函数将数据映射到高维空间:
常用核函数:
- 线性核:
- 多项式核:
- RBF核:
# 算法步骤
- 数据预处理:特征缩放和标准化
- 核函数选择:根据数据特点选择合适的核函数
- 参数优化:使用交叉验证选择最优参数
- 模型训练:求解对偶问题获得支持向量
- 预测:使用训练好的模型进行分类
# 优缺点
# 优点
- 在高维空间中表现良好
- 适用于非线性分类问题
- 泛化能力强
- 理论基础扎实
# 缺点
- 对大规模数据训练时间长
- 对参数选择敏感
- 对噪声数据敏感
- 不直接支持多分类
# 应用场景
文本分类
- 垃圾邮件检测
- 新闻分类
- 情感分析
图像识别
- 人脸识别
- 手写字符识别
- 目标检测
生物信息学
- 蛋白质分类
- 基因表达分析
- 疾病诊断
# 代码示例
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 生成示例数据
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15,
n_redundant=5, random_state=42)
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 创建SVM分类器
svm = SVC(kernel='rbf', C=1.0, gamma='scale')
# 训练模型
svm.fit(X_train, y_train)
# 预测
y_pred = svm.predict(X_test)
# 计算准确率
accuracy = svm.score(X_test, y_test)
print(f"模型准确率: {accuracy:.2f}")
# 调优技巧
核函数选择
- 线性核:数据线性可分
- RBF核:数据非线性
- 多项式核:特征间存在组合关系
参数优化
- C:控制惩罚项强度
- gamma:控制RBF核的复杂度
- degree:多项式核的次数
数据预处理
- 特征缩放
- 缺失值处理
- 异常值检测
# 常见问题与解决方案
训练效率问题
- 使用线性核加速
- 减少样本数量
- 特征选择
参数选择问题
- 网格搜索
- 随机搜索
- 贝叶斯优化
多分类问题
- 一对多策略
- 一对一策略
- 决策树结合
← 随机森林算法 K近邻(KNN)算法 →