简介
支持向量机(Support Vector Machine,简称 SVM)是一种非常强大且灵活的监督学习算法,用于分类和回归任务。其基本思想是在特征空间中找到一个最优的超平面,将不同类别的样本分开,并且使得超平面与最近的样本点的距离(也称为间隔)最大化。
以下是支持向量机的一些关键概念:
-
超平面(Hyperplane):在一个n维空间中,超平面是一个n-1维的平面,它将空间划分为两个部分。在二维空间中,超平面是一条直线,而在三维空间中,超平面是一个平面。
-
间隔(Margin):超平面与离它最近的样本点之间的距离称为间隔。SVM 的目标是最大化间隔,以提高分类的鲁棒性。
-
支持向量(Support Vectors):支持向量是离超平面最近的那些点。这些点决定了超平面的位置,并且在计算间隔和决定分类边界时起到重要作用。
-
核技巧(Kernel Trick):在低维特征空间中可能无法线性分割样本,这时可以使用核技巧将样本映射到高维特征空间中,从而实现在高维空间中线性分割样本的目的。常用的核函数包括线性核、多项式核、高斯核等。
-
正则化参数(Regularization Parameter):用于控制模型的复杂度,避免过拟合。正则化参数越大,模型的复杂度越低,反之亦然。
SVM 在解决线性和非线性分类问题上表现出色,并且对于高维数据集的处理效果也很好。其应用领域涵盖图像分类、文本分类、生物信息学、金融数据分析等多个领域。
原理
SVM的基本原理是找到一个最优的超平面,将不同类别的样本点分开,并使超平面与最近的样本点的距离最大化。
通过最大化间隔,提高分类的鲁棒性。
代码实现
- 生成数据集
def generate_data(samples):
# 生成随机特征
X = np.random.rand(samples, 2) * 10
# 根据新规则生成标签,x1 + x2 > 5 为类别1
y = np.zeros(samples)
for i in range(samples):
if X[i, 0] + X[i, 1] > 10:
y[i] = 1
return X, y
- 划分数据集
def split_data(X, y, rate):
#调整标签数组的形状
y.resize((y.size, 1))
#合并特征和标签
data = np.concatenate((X, y), axis=1)
#打乱数据
np.random.shuffle(data)
test_len = y.size - int(rate * y.size)
return data[:test_len, :2], data[test_len:, :2], data[:test_len, 2], data[test_len:, 2]
- 向量机训练模型
class SupportVectorMachine:
def __init__(self, learning_rate=0.01, num_iterations=1000, C=1.0):
self.learning_rate = learning_rate
self.num_iterations = num_iterations
self.C = C
self.weights = None
self.bias = None
def fit(self, X, y):
num_samples, num_features = X