支持向量机SVM

支持向量机(Support Vector Machine, SVM)是机器学习领域中一种重要的监督学习算法,主要用于数据分类问题。以下是关于支持向量机的详细介绍:

一. 定义与原理

定义:支持向量机是一种广义线性分类器,通过求解最大边距超平面来对数据进行二元分类。

原理:给定一组训练样本集,SVM的目标是找到一个超平面(在二维空间中为一条直线,三维空间中为一个平面,高维空间中则为超平面),使得该超平面能够将不同类别的样本分隔开,并且使得分隔的间隔最大这些位于间隔边界上的样本点被称为"支持向量"

超平面:在二维空间中,超平面表现为一条直线;在三维空间中,表现为一个平面;而在高维空间中,则是一个超平面。超平面可以用线性方程表示为w^{T}x+b=0,其中 w 是法向量,决定了超平面的方向;b 是截距,决定了超平面与原点之间的距离。

间隔:对于给定的数据集,SVM的目标是找到一个超平面,使得离超平面最近的样本点到超平面的距离最大。这个距离被称为间隔。在二分类问题中,我们设类别标签为 y ∈ {-1, 1},则样本点到超平面的距离可以表示为 y=\frac{|w^{T}x+b|}{||w||}。通过最大化这个距离,我们可以找到最优的超平面。其中两个异类支持向量机到超平面的距离之和为y=\frac{2}{||w||}

如下图所示:其中红色的为超平面,y为间隔,位于间隔上的点为‘支持向量’

二. 分类方式

线性可分:当训练数据线性可分时,SVM通过硬间隔最大化学习得到一个线性可分支持向量机。

近似线性可分:当训练数据近似线性可分时,SVM通过软间隔最大化学习一个线性支持向量机。

非线性可分:当训练数据不可分时,SVM通过使用核函数以及软间隔最大化,学习一个非线性支持向量机。

三、代码例子

1、先初始化

def __init__(self, learning_rate=0.0001, lambda_param=0.1, n_iters=1000):
   # 学习率learning_rate、正则化参数lambda_param、迭代次数n_iters
    self.learning_rate = learning_rate
    self.lambda_param = lambda_param
    self.n_iters = n_iters
    self.w = None
    self.b = None

2、训练模型

首先,将标签y转换为+1-1的形式

初始化权重和偏置项。

使用简单的梯度下降来更新权重和偏置项。

如果样本满足SVM的约束(即y_i * (w.x_i - b) >= 1),则只使用正则化项来更新权重。

如果不满足约束,则除了正则化项外,还使用样本的误差来更新权重和偏置项。

def fit(self, X, y):
    n_samples, n_features = X.shape
    # 将标签y转换为+1和-1的形式
    y_ = np.where(y <=0, -1, 1)
 
    # 初始化权重、偏置项
    self.w = np.zeros(n_features)
    self.b = 0
 
    # 迭代n_iters次
    for _ in range(self.n_iters):
        for idx, x_i in enumerate(X):
            # 计算当前数据点的间隔
            condition = y_[idx] * (np.dot(x_i, self.w) - self.b) >= 1
            if condition:
                #如果样本满足SVM的约束(即y_i * (w.x_i - b) >= 1),则只使用正则化项来更新权重。
                self.w -= self.learning_rate * (2 * self.lambda_param * self.w)
            else:
                #如果不满足约束,则除了正则化项外,还使用样本的误差来更新权重和偏置项。
                self.w -= self.learning_rate * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx]))
                self.b -= self.learning_rate * y_[idx]

3、预测

 使用np.sign函数将线性输出转换为+1或-1的标签

def predict(self, X):
    linear_output = np.dot(X, self.w) - self.b
    return np.sign(linear_output)

4、数据生成和训练

使用datasets.make_blobs生成一个包含两个类别的数据集。

将生成的标签转换为+1-1的形式。

创建一个LinearSVM对象并使用生成的数据进行训练。

#使用datasets.make_blobs生成一个包含两个类别(由y表示)的数据集。
X, y = datasets.make_blobs(n_samples=100, centers=2, random_state=6)
#将生成的标签转换为+1和-1的形式。
y = np.where(y == 0, -1, 1)
#创建一个LinearSVM对象并使用生成的数据进行训练。
svm = LinearSVM()
svm.fit(X, y)
 
# 训练完成后输出w和b的值
print("权重向量 w:", svm.w)
print("偏置项 b:", svm.b)

5、绘制超平面

使用matplotlib绘制数据集。

创建一个网格来评估决策边界。

计算网格上每个点的线性输出,并使用contour函数绘制决策边界。

最后调用plot_hyperplane函数显示数据集和由LinearSVM对象学习到的决策边界。

def plot_hyperplane(X, y, w, b):
    plt.scatter(X[:, 0], X[:, 1], marker='o', c=y, s=100, edgecolors='k', cmap='viridis')
 
    # 绘制决策边界
    ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
 
    # 创建一个网格来评估决策边界
    xx = np.linspace(xlim[0], xlim[1], 30)
    yy = np.linspace(ylim[0], ylim[1], 30)
    YY, XX = np.meshgrid(yy, xx)
    xy = np.vstack([XX.ravel(), YY.ravel()]).T
 
    # 计算网格上每个点的线性输出,并使用contour函数绘制决策边界。
    Z = (np.dot(xy, w) - b).reshape(XX.shape)
    ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
 
    plt.show()
 
plot_hyperplane(X, y, svm.w, svm.b)

6、运行结果:其中实线为超平面

四. 优缺点

优点:

非线性映射能力强,适用于非线性分类问题。

对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心

SVM是一种有坚实理论基础的小样本学习方法,避免了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”。

计算的复杂性取决于支持向量的数目,而不是样本空间的维数,避免了“维数灾难”。

缺点:

对大规模训练样本难以实施,因为求解二次规划将涉及大量计算。

解决多分类问题存在困难,通常需要组合多个二分类SVM来解决。

五. 应用场景

SVM在多个领域都有广泛的应用,如文本分类、图像识别、生物信息学、金融预测等

在文本分类中,SVM可以用于垃圾邮件过滤、情感分析、主题分类等。

在图像识别中,SVM可以应用于手写数字识别、人脸识别、物体检测等。

六. 优化与改进

特征选择:是优化SVM训练过程的关键步骤之一,可以减少训练时间并提高模型的泛化能力。

核函数选择:是SVM中的一个重要参数,不同的核函数适用于不同类型的数据集。

样本选择技术如随机欠采样、随机过采样和基于聚类的采样等,可以帮助减少训练时间和提高模型的泛化能力。

七. 总结

支持向量机是一种基于最大边距超平面的监督学习算法,具有坚实的数学理论基础和广泛的应用场景。虽然SVM在处理大规模训练样本和多分类问题时存在一些挑战,但通过合适的优化和改进方法,SVM仍然是一种非常有效的机器学习算法。

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值