支持向量机(支持向量机缺点)


【点击查看】低成本上班族靠谱副业好项目 | 拼多多无货源创业7天起店爆单玩法

【点击查看】逆林创业记 | 拼多多电商店铺虚拟类项目新玩法(附完整词表&检测工具)

【点击查看】逆林创业记 | 小白ai写作一键生成爆文速成课

领300个信息差项目,见公众号【逆林创业记】(添加请备注:网站)

SVM概念

支持向量机(Support Vector Machine,简称SVM)是一种经典的机器学习算法,主要用于数据分类问题。其核心思想是通过寻找一个超平面来对训练数据进行划分,使得不同类别的数据分布在超平面的两侧,且两侧数据点距离超平面的间隔最大化。

SVM的优缺点与应用场景

优点:

高效性:在高维空间中依然有效。它可以有效地处理具有大量特征的数据集,并且不易受到维度灾难的影响。

泛化能力强:SVM通过最大化分类间隔来构建最优的决策边界,从而在训练数据之外的新数据上表现出很好的泛化能力。对于未知数据的预测效果往往较好。

鲁棒性:SVM在构建模型时只关注支持向量,即位于决策边界附近的样本点。对于噪声和异常值有一定的容忍能力。

处理线性和非线性问题:SVM在处理线性可分和线性不可分的数据时都能够取得良好的效果。通过使用核函数,SVM可以将数据映射到高维特征空间,从而处理非线性问题。

缺点:

对参数敏感:SVM的性能受核函数、惩罚系数等参数影响较大。选择不当的参数值可能导致模型性能下降。此外,选择合适的核函数也是一个挑战,不同的数据集可能需要不同的核函数。

计算复杂度高:对于大规模数据集,SVM的训练时间较长。当处理大规模数据集时,训练时间和内存消耗可能会变得非常高,甚至难以承受。

对缺失数据敏感:SVM对于缺失数据比较敏感。如果数据中存在缺失值,需要进行额外的处理,如填充缺失值或者使用特定的方法处理缺失数据,否则可能影响模型的性能。

应用场景:

SVM的理论知识 线性可分支持向量机

如图,当两类点被一条直线完全分开叫做线性可分。线性可分支持向量机的学习目标是在特征空间中找到一个分割超平面,该分割超平面可以将特征空间分割成两部分,一部分是正类,一部分是负类。当训练数据集线性可分时,存在无数个分割超平面可将数据集正确分开,可以通过求解一个二次规划问题来找到最优的超平面。

分割线可以表示为:w·x+b = 0 ,其中w为法向量,b为截距。

支持向量和最大间隔超平面

支持向量(Support Vectors):

在SVM中,支持向量是指那些离决策边界(也称为超平面)最近的点。这些点对于确定决策边界的位置至关重要,因为决策边界是由这些点确定的。换句话说,如果我们稍微移动这些点中的任何一个,决策边界都会改变。而其他远离决策边界的点对决策边界的位置没有影响,因此它们被称为“非支持向量”。

在二维空间中,决策边界是一条直线;在三维空间中,它是一个平面;在更高维度中,我们称之为超平面。这些支持向量位于超平面的两侧,距离超平面最近的这些点到超平面的距离被称为“间隔”。

最大间隔超平面(Maximum Margin Hyperplane):

SVM的目标是找到一个能够将数据点正确分类并且使得间隔最大化的超平面。这个间隔是指支持向量到超平面的距离。为什么要最大化这个间隔呢?因为间隔越大,分类器的泛化能力就越强,即对新数据的分类准确性就越高。

为了找到这个最大间隔超平面,SVM使用了优化算法。具体来说,它试图找到一个超平面,使得该超平面与最近的支持向量之间的距离最大化。这个优化问题可以转化为一个二次规划问题,并可以通过求解该问题的对偶形式来找到最优解。

在找到这个最大间隔超平面后,我们就可以用它来对新的数据进行分类了。具体地,如果一个点位于超平面的一侧,我们就将其分类为某一类;如果它位于另一侧,我们就将其分类为另一类。

分割超平面与间隔最大化

分割线都成功的把黑点和白点给区分开了,如何判断这些分割线那条最优呢?

最优的超平面应该使得离它最近的样本点(称为支持向量)到它的距离最大化。这样做有两个好处:一是这样的超平面对噪声和异常值有更好的鲁棒性;二是这样的超平面在分类新数据时具有更好的泛化能力。

具体来说,我们定义一个分割超平面为 y(x) = wT x + b,其中 w 是权重向量,b 是偏置项,x 是数据点。分类决策函数为 f(x) = sign(wT x + b),其中 sign 函数将实数映射到 {-1,1},表示两个不同的类别。

在确定最优分割超平面时,我们希望最小化 w 的平方范数 ||w||,因为这等同于最大化间隔。因此,我们的优化问题变为:

求margin的最大值,其中margin = 2 / ||w||

约束条件:

y_i cdot (mathbf{w}^T mathbf{x}_i + b) geq 1

,对于所有的 i

其中,y_i 是类别标记(+1 或 -1),x_i 是数据点。这个约束条件确保了数据点被正确分类并且距离超平面的距离大于或等于1。

为了解决这个优化问题,我们通常采用拉格朗日对偶性,将原问题转化为对偶问题:

L(mathbf{w}, b, alpha) = frac{1}{2} lVert mathbf{w} rVert^2 + sum_i (alpha_i - alpha_i cdot y_i cdot (mathbf{w}^T mathbf{x}_i + b))

其中,α 是拉格朗日乘子,这个对偶问题可以通过求解其对 w 和 b 的导数并令其等于0来简化。最终,我们得到一个新的对偶问题:

最大化

W(alpha) = sum_{i} alpha_i - frac{1}{2} sum_{i} sum_{j} alpha_i alpha_j y_i y_j mathbf{x}_i cdot mathbf{x}_j

约束条件为:

sum_{i} alpha_i y_i = 0

alpha_i geq 0

求解这个对偶问题,我们就可以得到最优的 α 值,进而得到最优的权重向量 w 和偏置项 b,从而得到最优的分割超平面。

总的来说,我们通过最大化间隔(最小化 ||w||)支持向量机,并且确保数据点被正确分类,来找到最优的分割超平面。这个问题可以通过拉格朗日对偶性转化为对偶问题,并且可以通过求解对偶问题来得到最优解。

核函数

当数据非线性可分时,可以通过引入核函数将数据映射到高维空间,使得数据在高维空间中线性可分。核函数事先在低维上计算,而将实质上的分类效果表现在了高维上。

在实际中,我们会经常遇到线性不可分的样例,此时,我们的常用做法是把样例特征映射到高维空间中去,但如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕的支持向量机,此时就需要使用核函数。核函数虽然也是将特征进行从低维到高维的转换,但核函数会先在低维上进行计算,而将实质上的分类效果表现在高维上,避免了直接在高维空间中的复杂计算。

如下图所示的两类数据,这样的数据本身是线性不可分的,当我们将二维平面的坐标值映射一个三维空间中,映射后的结果可以很明显地看出,数据是可以通过一个平面来分开的。

常见的核函数:

对于非线性的情况,SVM 的处理方法是选择一个核函数 ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。由于核函数的优良品质,这样的非线性扩展在计算量上并没有比原来复杂多少,这一点是非常难得的。当然,这要归功于核方法——除了 SVM 之外,任何将计算表示为数据点的内积的方法,都可以使用核方法进行非线性扩展。

正则化与软间隔

为了解决数据中存在噪声或异常值的问题,允许部分数据点不满足间隔最大化的要求,即引入软间隔。

引入正则化强度参数C(正则化:在一定程度上抑制过拟合,使模型获得抗噪声能力,提升模型对未知样本的预测性能的手段,即提高范化性)

SVM基础代码实现

支持向量机(SVM)算法来分类二维数据集,并可视化不同C值(正则化参数)对分类边界和支持向量的影响的代码实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
# 创建 40 个点  
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20
Y = np.array(Y)  # 将 Y 转换为 NumPy 数组以便进行索引  
# 添加噪点  
num_noise = 2
noise_indices = np.random.choice(range(40), num_noise, replace=False)
Y[noise_indices] = 1 - Y[noise_indices]
# 绘制原始数据点  
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired, label='Data points')
# 建立 svm 模型,并添加 C 参数来改变对噪点的敏感度  
C_values = [0.1, 1, 10, 100]  # 尝试不同的 C 值  
colors = ['red', 'green', 'blue', 'purple']
for C, color in zip(C_values, colors):
    clf = svm.SVC(kernel='linear', C=C)
    clf.fit(X, Y)
    # 绘制划分超平面
    w = clf.coef_[0]
    a = -w[0] / w[1]
    xx = np.linspace(-5, 5)
    yy = a * xx - (clf.intercept_[0]) / w[1]
    plt.plot(xx, yy, color=color, label=f'C={C}')  # 注意这里使用 color=color 而不是 color + '-'
    # 圈出支持向量  
    plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
                s=80, facecolors='none', edgecolors=color, label='_nolegend_')
# 显示图例  
plt.legend()
plt.axis('tight')
plt.show()

代码分析

数据生成:

使用numpy.random.randn生成两组随机的二维数据点,每组20个,分别标记为0和1。

引入了一些噪声点,通过随机选择两个数据点并改变其标签来实现。

数据可视化:

使用matplotlib.pyplot.scatter绘制原始数据点,并使用颜色区分不同类别。

SVM模型训练:

定义了四个不同的C值(0.1, 1, 10, 100),C值在SVM中控制对错分样本的惩罚程度,进而影响模型的复杂度。

对每个C值,训练一个线性SVM模型。

超平面可视化:

计算SVM模型的权重向量w和截距b,并据此绘制分类超平面。

支持向量可视化:

绘制出每个模型的支持向量,支持向量是距离超平面最近的点,它们决定了超平面的位置。

图例显示:

使用plt.legend()显示图例,包括不同C值对应的分类边界和支持向量。

运行结果截图

结果分析

C值的影响:

当C值较小时(如C=0.1),模型对噪声的容忍度较高,可能会忽略一些噪声点,导致分类边界较宽,但也可能造成一些真实样本被错分。

当C值增大时(如C=100),模型对错分样本的惩罚增大,会尽可能正确分类所有样本,包括噪声点,这可能导致分类边界变窄,模型复杂度增加,甚至出现过拟合现象。

支持向量的作用:

支持向量是确定分类超平面的关键,它们位于分类边界上或附近。

随着C值的增大,支持向量的数量可能会增加,因为模型会更加关注那些难以分类的样本。

可视化效果:

通过可视化,可以直观地看到不同C值对分类边界和支持向量的影响,从而帮助选择合适的C值。

噪声点的影响:

噪声点的引入增加了分类的难度,但通过观察不同C值下的分类结果,可以评估模型对噪声的鲁棒性。

模型复杂度与泛化能力:

通过调整C值,可以在模型复杂度和泛化能力之间找到平衡。较小的C值可能导致模型过于简单,无法捕捉到数据的复杂结构;而较大的C值可能导致模型过于复杂,出现过拟合现象。在实际应用中,需要通过交叉验证等方法来选择合适的C值。

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ3361245237,本站将立刻清除。