【机器学习】十大算法之一 “SVM”

 

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?type=blog个人简介:打工人。

持续分享:机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。

如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com 

        

        机器学习算法种类繁多,SVM支持向量机算法是其中十大常用算法之一。该算法起源于20世纪80年代,并在90年代逐渐形成了比较完整的理论体系和工程应用。该算法在分类领域有着广泛的应用,并在多项应用场景中表现出了较优的性能。

本文讲详细讲解机器学习十大算法之一“SVM”


目录

一、简介

二、SVM的发展史

三、SVM算法公式讲解

四、SVM的算法原理

        1. 高效

        2. 对样本大小不敏感

        3. 可以通过核函数处理非线性分类问题

        4. 对边缘数据敏感

五、SVM算法的功能

        1. 分类问题

        2. 回归问题

        3. 异常检测

六、示例代码

        1. 实现一个简单的线性SVM模型

        2. 实现一个带核函数的SVM模型

七、总结


一、简介

        支持向量机(Support Vector Machine,SVM)是机器学习十大算法之一,是一种二分类模型。SVM将实例空间映射到一个高维空间,将空间进行线性划分,同时使得分类面到两端最近的数据点的距离(margin)最大化,因此SVM也被称为最大间隔分类器(Maximal Margin Classifier)。SVM是由Vapnik和Cortes于1995年提出的,是一种广泛应用的机器学习算法,具有很好的泛化能力和鲁棒性。

二、SVM的发展史

        SVM算法是由Vapnik等人于1995年提出的。Vapnik等人早在1982年就开始了支持向量机的研究工作。SVM最初是被应用于二元分类问题,后来发展成可以用于多元分类、回归分析和异常检测等领域。

        SVM在很长一段时间内由于其算法复杂度高、理论不足、实际应用受限等问题,挣扎着发展。直到20世纪90年代期初,SVM才经过若干改进,达到了一个比较成熟的阶段。同时,大量的工作表明,SVM是非常成功的分类器,并在模式识别、计算机视觉、自然语言处理等领域得到广泛应用。

三、SVM算法公式讲解

        下面我们介绍一下SVM的算法公式和其背后的意义。

        在SVM中,我们首先需要根据训练数据构建一个超平面(Hyperplane),以此来分隔数据。超平面是在空间中将不同类别的数据分开的一条直线或曲面。如图所示,绿色和红色点表示两类数据,直线为超平面。

        超平面的数学定义为:每个样本点(xi​,yi​) 有yi​(wxi​+b)≥1,其中w表示超平面的法向量,b表示截距,yi​表示样本的标签。

        在上述公式中,当数据是线性可分时,我们可以找到一条相对于所有其他直线都是最优的分类直线,这条直线就被称为间隔最大化超平面(Maximum Margin Hyperplane,MMH)。寻找最优分割线的过程就是一个最优化问题,此时SVM就被定义为通过最大化一定间隔来实现分类的一种线性分类器。

        当数据不是完全线性可分时,我们就需要引入松弛变量(Slack Variable)\xiξ。超过最大间隔(Margin)的样本点它们的\xiξ值将大于1。我们需要找到一个平衡点,让所有误分类点尽量多地分在同一侧,并且最大化间隔,同时降低\xiξ值。具体来说,我们需要找到一个平衡\xiξ值和分类准确率的点,在这个点上,我们既能够达到最大间隔,又不会牺牲太多的分类准确率。这样的分类器我们称为软间隔SVM。

        在经过优化后,最终SVM的目标函数可以表示为:

        目标函数的第一项表示最小化模长,这个代表了要寻找一个“干净”的分割线。如果不考虑约束条件,我们会找到能够将训练样本点完美分隔的超平面,但是这样的超平面在未来可能会得到较差的结果。第二项是异常点的正则化项,它表示决策面的复杂度。CC是一个超参数,用于在最小化第一项和第二项之间找到一个合适的平衡点。

        通过对目标函数进行拉格朗日乘子法(Lagrange Multiplier)的变换,我们可以获得SVM的对偶形式:

         其中,αi​是拉格朗日乘子,x⋅y表示向量x和y的内积,即x⋅y=∣∣x∣∣⋅∣∣y∣∣cos(θ),∣∣x∣∣表示向量x的模长,θ表示向量x和y的夹角。

        它与原始问题的解等价,并且通常在实践中使用对偶形式来解决超大规模的问题。求得α向量后,我们可以使用以下公式来预测测试数据的类别:

        其中,t为测试样本。

四、SVM的算法原理

        SVM的原理并不复杂,其主要思想是:如果两类数据可以用一个超平面有效地分割,那么SVM就寻找一个最大化分类间隔的超平面。这个分类间隔是指两个类之间的距离,也就是超平面两侧到最近数据点的距离之和。因此,SVM真正的目标是求得最大间隔的超平面(即MMH),以便最大程度地提高泛化性能。当数据不是完全线性可分时,SVM会引入松弛变量,从而得到一个平衡点,以降低误分类数据点的影响,这样的SVM就是软间隔SVM。同时,SVM可以通过使用核函数来处理非线性问题。

        SVM算法的主要特征包括以下几个方面:

        1. 高效

        SVM是一种高效的算法,其能够对高维空间中的数据进行分类工作。它的运算的复杂度与训练数据的点的数量有关,而与维度无关。

        2. 对样本大小不敏感

        SVM算法的采用与样本规模的大小无关,并且在小样本集中非常高效,这个算法著名的维度灾难(Curse of Dimensionality)只影响高维空间中样本数量过多的情况。

        3. 可以通过核函数处理非线性分类问题

        SVM算法通过引入核函数来处理非线性性分类问题,这种方法被称为非线性SVM(nonlinear SVMs)。

        4. 对边缘数据敏感

        SVM算法的预测依赖于少数的边缘数据点,这些点被称为支持向量(Support Vectors)。

五、SVM算法的功能

        SVM主要用于分类问题、回归问题和异常检测等领域。

        1. 分类问题

        SVM的核心思想是找到一个超平面来最大化分类间隔,SVM可以解决线性和非线性分类问题,在二元和多元分类问题上的表现优秀。

        2. 回归问题

        SVM同时也是一种基于统计学习理论的回归分析方法。它通过最小化预测误差和最大化分类间隔来处理回归问题。

        3. 异常检测

        在异常检测中,SVM可以发现一个在高维空间中的数据子集,该子集拥有异常成员。本质上,这是一个在多维标准(multivariate criterion)空间中寻找一个超平面的问题,这个问题可以被转化为一个带约束的优化问题。

六、示例代码

        下面我们将使用Python来展示一个简单的SVM分类器的实现,并对其进行简单的测试。

        首先,我们需要导入以下库:

from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import numpy as np

        1. 实现一个简单的线性SVM模型

        下面,我们将使用Python的SVM库,实现一个简单的线性SVM模型。在这个模型中,我们将使用鸢尾花数据集(Iris dataset)来进行分类。

# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target
 
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42)

# 创建模型
clf = svm.SVC(kernel='linear')
 
# 训练模型
clf.fit(X_train, y_train)
 
# 预测
y_pred = clf.predict(X_test)

# 计算准确率
acc = accuracy_score(y_test, y_pred)
print("Accuracy: ", acc)

结果:

Accuracy: 0.7555555555555555

        2. 实现一个带核函数的SVM模型

        下面,我们将使用Python来实现一个带有核函数的SVM模型。

# 加载数据集
X, y = datasets.make_circles(n_samples=300, factor=.3, noise=.05)

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                        test_size=0.3, random_state=42)
 
# 创建模型
clf = svm.SVC(kernel='rbf', gamma=0.7)
 
# 训练模型
clf.fit(X_train, y_train)
 
# 预测
y_pred = clf.predict(X_test)

# 计算准确率
acc = accuracy_score(y_test, y_pred)
print("Accuracy: ", acc)

结果:

Accuracy:  1.0

        这是一个非线性问题,但是我们通过使用径向基函数(Radial basis function)来找到了一个非常好的解。

七、总结

        SVM是一种非常有用的算法,它在分类和回归问题中都表现出色。SVM的主要思想是找到一个良好的决策边界,以便正确地将数据分类。 SVM使用支持向量来确定边界,这些支持向量是从训练数据中选择的。

        SVM算法可以用于二元分类和多类别分类问题,可以使用不同的核函数来解决非线性问题。有许多SVM变种,包括核SVM,线性SVM和非线性SVM。 SVM还可以处理大规模问题,具体方法是通过适当的技术简化问题。

        总之,SVM算法是机器学习中非常重要的算法之一,它通过优化一个目标函数,找到最佳的决策边界。 SVM算法可以用于许多不同的问题,在许多不同的领域被广泛应用,因此对它的研究和应用具有非常重要的价值。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的男孩。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值