返回

SVM之Linear SVM的手撕过程:从原理到实践

人工智能

手撕线性 SVM:原理篇

机器学习的世界中,支持向量机(SVM)是一个强大的分类算法,它能够有效解决复杂的数据分类问题。SVM 的核心思想是找到一个超平面,将数据点分隔成不同的类,并最大化超平面与最近数据点的距离。

线性 SVM 是 SVM 家族中最简单的一种,它假设数据在特征空间中是线性可分的。线性可分 是指存在一个超平面,可以将不同的类完全分离开来。

线性 SVM 的原理

线性 SVM 的目标是找到一个超平面,使得:

  • 超平面将不同的类分离开来,即没有数据点位于超平面的一侧。
  • 超平面与最近数据点的距离最大化,这称为间隔

超平面方程

线性超平面可以用以下方程表示:

w^T x + b = 0

其中:

  • w 是超平面的权重向量
  • x 是数据点
  • b 是超平面的偏置

间隔

间隔是超平面与最近数据点的距离,对于线性 SVM 来说,间隔可以表示为:

γ = 1/||w||

其中:||w||是权重向量的范数。

推导线性 SVM

线性 SVM 的推导目标是找到 w 和 b,使得间隔最大化。可以通过解决以下优化问题来实现:

min ||w||^2
s.t. y_i(w^T x_i + b) >= 1, ∀i

其中:

  • y_i 是数据点 x_i 的标签,+1 表示正类,-1 表示负类
  • ∀i 表示优化约束对所有数据点都成立

对偶问题

通过引入拉格朗日乘子,可以将原始优化问题转化为对偶问题:

max α_i - 1/2ΣΣα_iα_j y_i y_j x_i^T x_j
s.t. Σα_i y_i = 0, α_i >= 0, ∀i

其中:α_i 是拉格朗日乘子。

SMO 算法

SMO(序列最小优化)算法是一种求解对偶问题的迭代算法。SMO 算法的优点是它只更新一对 α_i 和 α_j,而不是同时更新所有 α_i。

实践篇:编程实现

import numpy as np
import pandas as pd
from sklearn.svm import SVC

# 导入数据
data = pd.read_csv('data.csv')

# 创建线性 SVM 分类器
clf = SVC(kernel='linear')

# 训练分类器
clf.fit(data[['feature1', 'feature2']], data['label'])

# 预测新数据
predictions = clf.predict([[0.5, 0.5]])

总结

线性 SVM 是一个强大的分类算法,对于线性可分的数据非常有效。通过手撕推导和编程实现,我们对线性 SVM 的原理和实践有了深入的理解。