站点图标 AI技术聚合

西瓜书–第六章.支持向量机(SVM)

西瓜书--第六章.支持向量机(SVM)

内容

内容

1. 硬间距和支持向量

1、线性可分支持向量机

2、函数间隔与几何间隔

样本点与超平面是保持着一定函数距离的,通过超平面方程和函数距离,以计算其距离,得到两条边界函数wx+b=1和wx+b=-1进而分类。

功能区间:

几何间隔:

3、间隔最大化

对偶问题

拉格朗日乘数法:

3.内核函数

1、线性不可分

2、核函数

4. 软区间和正则化

软边距(包括线性支持向量机):

5. 支持向量回归

6.核法

1、核方法

2、非线性支持向量机

内容

支持向量机是一种广义线性分类器,它按照监督学习的方法对数据进行二元分类,并定义特征空间上的最大区间。这是它的基本模型。它的决策边界是为学习样本求解的最大边距超平面。 SVM 也是一个二分类模型。最大间隔使其与感知器不同;支持向量机的学习策略是最大化区间,可以归结为求解凸二次规划的问题,那么它的学习算法就是求解凸二次规划的优化算法。

三种模型分别是:线性可分支持向量机、线性支持向量机和非线性支持向量机。

1. 硬间距和支持向量

1、线性可分支持向量机

当训练数据近似线性可分时,通过最大化硬边距来学习线性分类器,即线性可分支持向量机,也称为硬边距支持向量机。线性可分离支持向量机使用硬边距最大化来求解最优分离超平面并获得唯一解,这与感知器不同。感知器采用误分类最小的策略获得超平面,得到的解是无限的。许多。 (关于感知器的详细解释,请参考李航的《统计学习方法》) 线性可分支持向量机的唯一解可以说明使用了硬区间,因为它可以完全准确分类,并且可以有没有错误分类。

线性可分简单来说就是用一条直线将分类样本分开,一般有两种情况:第一,在二维平面上,线性可分指的是可以用一条线将分类样本分开;第二,在三维空间中,线性可分则意味着可以用一个平面将分类样本分开。然而,并不是仅用一条线就可以完全地被正确分开的,需有多条直线(如图线1、线2和线3);而每一条直线都是有宽度的,用来分割分类样本,这样的直线称为超平面,亦称分离超平面。

分离超平面的方程为:w* ·x+b*=0

分类决策函数:f(x)=sign(w*·x+b*)

训练数据集是线性可分的,即有很多条直线可以正确地对两类数据进行分类;线性可分支持向量机对应于正确划分两类数据且区间最大的直线。

在线性可分情况下,训练数据集的样本点中与分离超平面距离最近的样本点的实例点称为支持向量。而支持向量是使约束条件等号成立的点,即y(w·x+b)-1=0。

图中红色标记的示例点是支持向量。

我们的任务是在集合的边缘找到一些数据,并利用这些点找到一个超平面(即选择一个超平面)。 .

2、函数间隔与几何间隔

样本点与超平面是保持着一定函数距离的,通过超平面方程和函数距离,以计算其距离,得到两条边界函数wx+b=1和wx+b=-1进而分类。

功能区间:

点到分离超平面的远近:|w·x+b|—->表示分类预测的确信程度

w·x+b 的符号与类标记y的符号是否一致—->表示分类是否正确

所以:y(w·x+b)表示分类的正确性和确信度。

几何间隔:

样本点的几何间距:正例和反例

正面例子:

H1:w·x+b=1

负面例子:

H2:w·x+b=-1

当数据被正确分类时,几何间隔就是点到超平面的距离。为了求几何间隔最大,可转化为求解d*/||w||(d*为函数间隔)

方法一:转化为凸函数(令d*=1)

方法二:用拉格朗日乘子法和KKT条件求解最优值

3、间隔最大化

不仅将正负实例点分开,而且对于最困难的实例点(即最接近超平面的点)也有足够的置信度将它们分开,这样的超平面应该对未知的新实例点有很好的分类预测能力。

因此,支持向量机模型就是使支持向量两侧的所有样本点成为各自分类类别的支持向量。

对偶问题

拉格朗日乘数法:

支持向量机求解最优分离超平面问题时,利用拉格朗日对偶将原问题转化为对偶问题,通过对偶问题求解得到原问题的解。

设给定二元函数z=f(x,y)和附加条件,为寻找z=f(x,y)在附加条件下的极值点。

拉格朗日乘子法的公式如下:

二次项:f(x,y)

约束:

参数:

将目标函数和约束条件代入式子,便可得到它的对偶问题将求解w,b的问题转化为求最大值的问题。所求的解是拉格朗日乘子,求解后还需要对w,b求解的。

3.内核函数

1、线性不可分

线性可分是指有一条直线可以分割样本点,但有时会失败,即支持向量机不适合线性可分,即线性不可分。线性不可分是指一个数据集找不到一条直线来划分样本点,但可能有一条曲线可以划分样本点。

那么有什么方法可以解决线性不可分的问题呢?假设,这样曲线方程可以映射成a+b=4。这样就可以把线性不可分问题变成线性可分问题了。把样本点通过核函数映射到,就可以将原本线性不可分的样本点变成线性可分。

2、核函数

函数是核函数。核函数可以将样本从原始空间映射到更高维的特征空间,使样本在新空间中线性可分。

一般常见的三种核函数:线性核函数,认为样本点线性可分,不做任何映射;多项式核函数是一个p次多项式函数,需要进行调参;高斯核函数,将特征空间映射到更高维空间;sigmoid核函数,用在神经网络的映射中,实现的是多层神经网络。

在选择核函数时,可以根据特征数和样本数来确定核函数。如果特征数量与样本数量几乎相同,则选择线性或多项式核函数;如果特征较少且样本正常,则选择高斯核函数。

线性核函数需要指定惩罚因子,多项式核函数需要指定乘法因子和项式,高斯核函数需要指定乘法因子和gamma。(参数c称为惩罚因子;gamma是核函数系数,默认为特征数的倒数 )

4. 软区间和正则化

软边距(包括线性支持向量机):

直到现在一直假设线性可分,但实际上很难确定合适的核函数以使其可分。解决这个问题,就是允许一定数量的样本点被错误分类。如前所述,硬区间是完全准确的,不可能有误分类,所以软区间允许支持向量机在某些样本上出错。由于可以容忍一些样本分类误差,所以仍然可以使用线性可分模型,称为近似线性可分。

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​软间距

其次,为了使样本分类变得不想硬间隔那么严格,引入一个“松弛变量”,使得函数间隔加上松弛变量大于等于1。

hinge损失函数:

每个样本都有一个对应的松弛变量来表征样本不满足约束的程度。

(因为我对正则化的了解不够,无法总结,暂时遗漏!)

5. 支持向量回归

支持向量分类的方法可以被扩展用来解决回归问题,因此这个方法被称为支持向量回归(简称SVR)支持向量回归生成的模型只依赖于训练集的子集,因为构建模型的损失函数忽略了任何接近于模型预测的训练数据。

与分类的类别一样,使用fit方法调用参数X,y,但只是此时y的取值是浮点数而不是整数。

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

6.核法

1、核方法

在线性支持向量机问题中,无论是目标函数还是分离超平面都只涉及输入实例和实例的内积(内积本文不做介绍,但建议学习)。实际上,内积已经被核函数代替了。如果给定一个核函数,它就是一个支持向量机,可以解决线性分类问题,解决非线性分类问题,但不需要定义特征空间和映射函数。这是一种基于核函数发展起来的学习方法,统称为核方法。通常通过核函数将线性学习器扩展到非线性学习器。

2、非线性支持向量机

非线性可分问题:使用中的超曲面可以正确分离正负样本。

使用线性分类方法解决非线性分类问题:

1.先使用一个变换将原始空间的数据映射到新空间;

2.后在新空间用线性分类学习方法从训练数据中学习分类模型。

板栗:

利用RBF核的非线性svc进行二值分类。要预测的目标是输入的异或。

颜色图说明了SVC学习的决策函数

​​​​​​​​​​​

第 3 章 – 线性模型

http://t.csdn.cn/4S6Y6http://t.csdn.cn/4S6Y6第四章-决策树

http://t.csdn.cn/O4SBrhttp://t.csdn.cn/O4SBr第五章-神经网络

http://t.csdn.cn/DdirShttp://t.csdn.cn/DdirS

支持向量机:

from sklearn import svm
import pandas as pd
from sklearn.model_selection import train_test_split

# 导入数据
data = pd.read_csv("iris.csv")

# 获取具体数据
x = data.iloc[:, 0:4]  # 按位置取某几列
y = data["Name"].values

# 分割数据
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)

# 训练数据与模型评估
clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
clf.fit(x_train, y_train.ravel())
print("训练集精度:", clf.score(x_train, y_train))
print("测试集精度:", clf.score(x_test, y_test))

运行结果:

训练集精度: 1.0
测试集精度: 0.85

支持向量回归:

import numpy as np
from sklearn import svm

N = 30
np.random.seed(0)
x = np.sort(np.random.uniform(0, 2 * np.pi, N), axis=0)
y = 2 * np.sin(x) + 0.2 * np.random.randn(N)
x = x.reshape(-1, 1)

print('SVR - Linear')
svr_linear = svm.SVR(kernel='linear', C=100)
svr_linear.fit(x, y)
print(svr_linear.score(x, y))   # 0.5339581033415435

文章出处登录后可见!

已经登录?立即刷新
退出移动版