支持向量机

一、简介

        支持向量机(Support Vector Machine, SVM)是一种监督学习算法,主要用于分类和回归任务。它在解决小样本、非线性、高维问题上表现出色,因此在机器学习领域非常受欢迎。

        支持向量机(support vector machine,SVM)是有监督学习中最有影响力的机器学习算法之一,该算法的诞生可追溯至上世纪 60 年代, 前苏联学者 Vapnik 在解决模式识别问题时提出这种算法模型,此后经过几十年的发展直至 1995 年, SVM 算法才真正的完善起来,其典型应用是解决手写字符识别问题。

        SVM 是一种非常优雅的算法,有着非常完善的数学理论基础,其预测效果,在众多机器学习模型中“出类拔萃”。在深度学习没有普及之前,“支持向量机”可以称的上是传统机器学习中的“霸主”。

        支持向量机是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。支持向量机的学习算法是求解凸二次规划的最优化算法。

        基础的SVM算法是一个二分类算法,至于多分类任务,可以通过多次使用SVM进行解决。

二、关键概念

2.1线性可分

        对于一个数据集合可以画一条直线将两组数据点分开,这样的数据成为线性可分(linearly separable),如下图所示:

         分割超平面:将上述数据集分隔开来的直线成为分隔超平面。对于二维平面来说,分隔超平面就是一条直线。对于三维及三维以上的数据来说,分隔数据的是个平面,称为超平面,也就是分类的决策边界。
        间隔:点到分割面的距离,称为点相对于分割面的间隔。数据集所有点到分隔面的最小间隔的2倍,称为分类器或数据集的间隔。论文中提到的间隔多指这个间隔。SVM分类器就是要找最大的数据集间隔。
        支持向量:离分隔超平面最近的那些点。

        SVM所做的工作就是找这样个超平面,能够将两个不同类别的样本划分开来,但是这种平面是不唯一的,即可能存在无数个超平面都可以将两种样本分开,那么我们如何才能确定一个分类效果最好的超平面呢?
        Vapnik提出了一种方法,对每一种可能的超平面,我们将它进行平移,直到它与空间中的样本向量相交。我们称这两个向量为支持向量,之后我们计算支持向量到该超平面的距离d,分类效果最好的超平面应该使d最大。 

2.2线性不可分

        对于线性不可分的数据集,我们无法找到这样一种直线,将不同类型的样本分割开来,SVM的方法好像就不适用了。但是Vapnik提出了一种观点,我们所认为的线性不可分,只是在当前维度下线性不可分,并不代表它在高维空间中线性不可分。比如有一组样本在二维空间线性不可分,但是在三维空间中,我们是有可能找到这样一条直线将其分隔开来的,Vapnik还认为,当维数趋于无穷时,一定存在这样一条线,可以将不同类型的样本分割开来。

        在提升维度后,原本非线性的数据点变得线性可分,这在数学上是有严格证明的,即Cover定理。Cover定理可以定性地描述为:将复杂的模式分类问题非线性地投射到高维空间将比投射到低维空间更可能是线性可分的,当空间的维数D越大时,在该空间的N个数据点间的线性可分的概率就越大。即如果能把数据从低维空间映射到高维空间,我们就很可能在高维空间把数据做线性可分。对于在N维空间中线性不可分的数据,在N+1维以上的空间会有更大可能变成线性可分的。     

        所以人们就努力的寻找一种映射,这映射能将样本从原始空间(低维数据)转变到高维特征空间,从而把低维空间中线性不可分的两类点变成线性可分的。这种映射ϕ(X) 又可称为“特征构建”,映射后的向量可称之为“特征向量”。

        首先,输入的数据样本集为一组N个m0维的向量x1,x1,...,xN,每个样本都被归类到两个类C1和C2之一。定义一组实值函数(也就是输入一个向量输出一个实数的函数)φ1(x),φ2(x),...,φm1(x),用来将输入数据映射到一个m1维的空间,将它们组成一个向量:

 

        这个函数向量ϕ的输出可被认为是被映射到高维空间之后的输入数据x。φi(x)称为隐藏函数,其组成的向量ϕ所在的空间称为隐藏空间特征空间。如果有那么个m1维的向量w,使得这个成立: 

        也就是说被ϕ映射到另一个高维空间的数据样本们成了线性可分的,就说这个把x分类到C1和C2的分法是ϕ可分的。对于x来说, wTϕ(x)=0就是一个分类曲面。 

 2.3核函数

        当样本数据线性不可分时,SVM 通过引入核函数来将数据映射到高维特征空间,从而使得非线性问题在高维空间中变得线性可分。

        核函数方法处理非线性问题的基本思想:按一定的规则进行映射,使得原来的数据在新的空间中变成线性可分的,从而就能使用之前推导的线性分类算法进行处理。计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数。 

        核函数除了能够完成特征映射,而且还能把特征映射之后的内积结果直接返回。即把高维空间得内积运算转化为低维空间的核函数计算,避免了直接在高维空间中的复杂计算,将完全不可分问题,转换为可分或达到近似可分的状态。

2.4正则化与软间隔

         针对样本不是完全能够划分开的情况,可以允许支持向量机在一些样本上出错,为此要引入“软间隔”的概念。

        

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

 上式为采用hinge损失的形式,再引入松弛变量ξi≥0,重写为:

 支持向量:

 由此可以看出,软间隔支持向量机的最终模型仅与支持向量有关,即通过采用hinge损失函数仍保持了稀疏特性。

 三、代码实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

# 加载数据集
iris = 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=0)
# 定义SVM模型
svm = SVC(kernel='rbf', C=1.0)
svm.fit(X_train, y_train)


# 绘制散点图
def plot_scatter(X, y):
    plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='red', marker='o', label='Setosa')
    plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='blue', marker='x', label='Versicolor')
    plt.scatter(X[y == 2][:, 0], X[y == 2][:, 1], color='green', marker='s', label='Virginica')
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')
    plt.legend(loc='upper right')
    plt.show()


# 可视化训练集
plot_scatter(X_train, y_train)


# 可视化测试集和决策边界
def plot_decision_boundary(model, X, y):
    h = 0.02  # 网格步长
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = model.predict(np.hstack((xx.ravel()[:, np.newaxis], yy.ravel()[:, np.newaxis])))
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')
    plt.title('SVM Decision Boundary')
    plt.show()


# 可视化测试集和决策边界
plot_decision_boundary(svm, X_test, y_test)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值