引言
支持向量机(Support Vector Machine,SVM)是一种经典的机器学习算法,广泛应用于分类和回归问题。SVM的核心思想是找到一个最优的超平面,使得不同类别的数据点尽可能被分开。本文将从SVM的基本原理出发,深入解析其源代码实现,帮助读者全面理解SVM算法。
SVM算法原理
1. 超平面与间隔
在二维空间中,一个简单的线性分类器可以通过一条直线来实现。这条直线被称为超平面,它将数据集划分为两个部分,分别代表不同的类别。超平面的中心线称为法线。
为了衡量超平面对数据集的划分效果,我们引入了“间隔”的概念。间隔是指从超平面到最近的训练样本点(支持向量)的距离。间隔越大,说明超平面对数据集的划分效果越好。
2. 最优超平面
SVM的目标是找到一个最优的超平面,使得所有数据点都能被正确分类,并且间隔最大。这个最优超平面称为最大间隔超平面。
3. 支持向量
在最优超平面上,距离最近的训练样本点被称为支持向量。支持向量是影响超平面位置的关键因素。
4. 线性可分与非线性可分
当数据集线性可分时,即可以通过一个超平面完全将不同类别的数据点分开,我们可以直接找到最大间隔超平面。但当数据集线性不可分时,我们需要引入核函数将数据映射到高维空间,再寻找最大间隔超平面。
SVM源代码深度解析
以下是一个简单的SVM源代码实现,使用了线性核函数:
import numpy as np
class SVM:
def __init__(self, C=1.0, kernel='linear'):
self.C = C
self.kernel = kernel
self.alpha = None
self.support_vectors = None
self.b = None
def linear_kernel(self, x1, x2):
return np.dot(x1, x2)
def fit(self, X, y):
n_samples, n_features = X.shape
self.alpha = np.zeros(n_samples)
self.support_vectors = np.zeros((n_samples, n_features))
self.b = 0
if self.kernel == 'linear':
for i in range(n_samples):
for j in range(n_samples):
self.alpha[i] += self.alpha[j] * (y[i] * y[j] * (self.linear_kernel(X[i], X[j]) - 1))
self.alpha[i] = max(0, min(self.alpha[i], self.C))
self.alpha[j] = max(0, min(self.alpha[j], self.C))
if self.alpha[i] > 0 and self.alpha[j] > 0:
self.support_vectors[i] = X[i]
self.support_vectors[j] = X[j]
self.b += y[i] * self.linear_kernel(X[i], X[j])
else:
raise ValueError("Unsupported kernel")
def predict(self, X):
return np.sign(np.dot(X, self.alpha * y) + self.b)
代码解析
初始化:定义SVM类,包括C参数、核函数和成员变量。
线性核函数:实现线性核函数。
fit方法:训练SVM模型,计算alpha、支持向量和b。
- 遍历所有样本点,更新alpha值。
- 如果alpha大于0,则将该样本点标记为支持向量。
- 更新b值。
predict方法:根据训练好的模型预测新样本的类别。
总结
本文从SVM的基本原理出发,详细解析了SVM源代码实现。通过学习本文,读者可以全面了解SVM算法的原理和实现,为后续的机器学习研究打下基础。