支持向量机(SVM)|机器学习

本文详细介绍了支持向量机(SVM)的基本原理,包括其主要特点,线性二分类问题中的间隔概念以及支持向量的作用。此外,还探讨了非线性情况下的核函数如何帮助解决线性不可分问题。通过实例展示了如何使用SVM进行数据分类,包括数据观察、模型训练以及分类效果的可视化。
摘要由CSDN通过智能技术生成


1.SVM基本原理

1.1特点

∙ \bullet 支持向量机(Support Vector Machine)主要用于解决模式识别领域中的数据分类问题,属于有监督学习算法的一种。

∙ \bullet 既可以做分类也可以做回归

∙ \bullet 适合于小样本集的场景。

1.2线性二分类问题

比如说对于线性二分类问题来说,我们就是要选择一条直线将两类点进行区分,但是观看下图我们会发现有无数条直线可以做到这一要求,那么我们的选择有什么要求呢?
在这里插入图片描述
因为这些点都是训练集中的点,而我们最后是要将这一模型使用在测试集上,所以我们就要尽可能选择距离离两类点都较远的直线。选来选去得到的就是位于最中心的那条红线,此时容忍性好,鲁棒性高,泛化能力最强。

1.3间隔与支持向量

在样本空间中,决策边界(超平面)可以通过如下线性方程来描述:

𝑤 T 𝑥 + 𝑏 = 0 𝑤^{T}𝑥+𝑏=0 wTx+b=0

其中 𝑤 = ( 𝑤 1 , 𝑤 2 , . . , 𝑤 𝑑 ) 𝑤=(𝑤_{1},𝑤_{2},..,𝑤_{𝑑}) w=(w1,w2,..,wd) 为法向量,决定了决策边界的方向。 𝑏 𝑏 b 为位移项,决定了决策边界与原点之间的距离。显然,决策边界(超平面)可被法向量和位移确定,我们将其表示为 ( 𝑤 , 𝑏 ) (𝑤,𝑏) (w,b) 。样本空间中的任意一个点 𝑥 𝑥 x ,到决策边界 ( 𝑤 , 𝑏 ) (𝑤,𝑏) (w,b) 的距离可写为:

𝑟 = ∣ 𝑤 𝑇 𝑥 + 𝑏 ∣ ∣ ∣ 𝑤 ∣ ∣ 𝑟=\frac{|𝑤^{𝑇}𝑥+𝑏|}{||𝑤||} r=wwTx+b

假设决策边界 ( 𝑤 , 𝑏 ) (𝑤,𝑏) (w,b) 能够将训练样本正确分类,即对于任何一个样本点 ( 𝑥 𝑖 , 𝑦 𝑖 ) (𝑥_{𝑖},𝑦_{𝑖}) (xi,yi),若它为正类,即 𝑦 𝑖 = + 1 𝑦_{𝑖}=+1 yi=+1 时, 𝑤 𝑇 𝑥 + 𝑏 ≥ + 1 𝑤^{𝑇}𝑥+𝑏≥+1 wTx+b+1 ;若它为负类,即 𝑦 𝑖 = − 1 𝑦_{𝑖}=−1 yi=1 时, 𝑤 T 𝑥 + 𝑏 ≤ − 1 𝑤^{T}𝑥+𝑏≤−1 wTx+b1。即:
{ w T x + b ≥ + 1 , y i = + 1 ; w T x + b ≤ − 1 , y i = − 1 ; \left\{\begin{matrix} w^{T}x+b \ge +1,y_{i}=+1; \\ w^{T}x+b \le -1,y_{i}=-1; \end{matrix}\right. {wTx+b+1,yi=+1;wTx+b1,yi=1;

在这里插入图片描述
我们可以看到在决策分界两边分别有一条边界,在这两条边界上的点就被称为“支持向量”,而它们(异类支持向量)到决策边界的距离之和就是“间隔”。我们要找的就是具有最大间隔的 w w w b b b,间隔表示为:

𝑟 = 2 ∣ ∣ 𝑤 ∣ ∣ 𝑟=\frac{2}{||𝑤||} r=w2

线性规划方程如下:
{ m a x w , b   2 ∣ ∣ w ∣ ∣ s . t .   y i ( w T x + b ) ≥ 1 ,   i = 1 , 2 , . . . m \left\{\begin{matrix} \underset{w,b}{max} \ \frac{2}{||w||} \\ s.t. \ y_{i}(w^{T}x+b)\ge 1, \ i=1,2,...m \end{matrix}\right. {w,bmax w2s.t. yi(wTx+b)1, i=1,2,...m

1.4核函数

∙ \bullet 事实上大部分时候数据并不是线性可分的,这个时候满足条件的超平面就根本不存在。对于非线性的情况,SVM处理方法是选择一个核函数,通过将数据映射到高维空间,然后在高维空间中构造最优分离超平面,从而把在低维平面上不好划分的非线性数据分割开来,解决线性不可分的问题。

在这里插入图片描述


2.实例

∙ \bullet 现有数据集中有三列数据,其中前两列未特征值,最后一列为标签值(两种标签)

取数据观察

data = pd.read_csv("/data/shixunfiles/5698fb30d8993a1a952de10fc7f0103d_1577667367017.csv")
data.head()

前五列数据如下:
在这里插入图片描述

绘制散点图决定使用哪种核函数

#提取特征值和标签值
X = data.iloc[:,:-1].values
y = data.iloc[:,-1].values

#绘制散点图进行观察
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='autumn')

如下图所示,很明显我们可以看到两类样本是线性可分的,所以使用线性核函数linear。
在这里插入图片描述

建立并训练模型

from sklearn.svm import SVC #导入支持向量机分类选择器SVC
#建立模型,并训练模型,核函数使用'linear'
model = SVC(kernel='linear')
model.fit(X,y)

绘制图形查看分类效果

def plot_svc_decision_function(model, ax=None, plot_support=True):
    """为2D SVC绘制决策图"""
    if ax is None:
        ax = plt.gca()
    #获取绘制图表的长和宽,得到两个边界值
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    
    # 为评估模型画网格线
    x = np.linspace(xlim[0], xlim[1], 30)
    y = np.linspace(ylim[0], ylim[1], 30)
    Y, X = np.meshgrid(y, x)
    xy = np.vstack([X.ravel(), Y.ravel()]).T
    P = model.decision_function(xy).reshape(X.shape)
    
    # 绘制决策边界(等高线图)
    ax.contour(X, Y, P, colors='k',
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])
    
    # 绘制支持向量
    if plot_support:
        ax.scatter(model.support_vectors_[:, 0],
                   model.support_vectors_[:, 1],
                   s=300, linewidth=1, facecolors='none');
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)

plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='autumn')
plot_svc_decision_function(model)

效果如下图展示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

比奇堡咻飞兜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值