SVM支持向量机

1 SVM简介

基本概念

 很久以前的情人节,公主被魔鬼绑架了,王子要去救公主,魔鬼和他玩了一个游戏。魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。"

在这里插入图片描述
在这里插入图片描述 在这里插入图片描述

SVM就是试图把棍子放在最佳位置,好让在棍的两边有尽可能大的间隙。
在这里插入图片描述
现在魔鬼即使放了更多的球,棍仍然是一个好的分界线。
在这里插入图片描述
现在魔鬼又玩了一个花招,将球如下摆放。在这里插入图片描述
王子拍了一下桌子,所有的球都飞了起来,然后拿了一张纸插在了两种颜色球的中间。
在这里插入图片描述
在这里插入图片描述

超平面

如果找到最佳的超平面

 在两侧的雷区中间决策出最宽的道路,Large Margin
在这里插入图片描述

构造超平面方程

假设存在一堆样本点 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , … ( x n , y n ) (x_1,y_1),(x_2,y_2),(x_3,y_3),\dots(x_n,y_n) x1,y1,x2,y2,x3,y3,xn,yn

(1)对于一个二维平面,其方程为:
y = k x + b ⇒ A x 1 + B x 2 + C = 0 y = kx+b \Rightarrow Ax_1+Bx_2 +C = 0 y=kx+bAx1+Bx2+C=0

(2)对于一个三维平面,其方程为:
A x 1 + B x 2 + C x 3 = D Ax_1+Bx_2+Cx_3 = D Ax1+Bx2+Cx3=D

(3)对于更高维的(超平面),其方程为:
ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n + b = 0 \omega_1x_1+\omega_2x_2+\dots+\omega_nx_n+b=0 ω1x1+ω2x2++ωnxn+b=0

以上综合为超平面函数:
ω t ϕ ( x ) + b = 0 \omega^t\phi(x)+b=0 ωtϕ(x)+b=0  其中 ϕ ( x ) 可 以 看 作 x \phi(x)可以看作x ϕ(x)x

标签问题

在SVM中,我们不用0和1来区分两种样本,使用+1和-1来区分。这样更加严谨。
假设超平面可以将训练样本正确分类,那么对于任意样本来说:
y = + 1 y=+1 y=+1为正例
y = − 1 为 负 例 y=-1为负例 y=1

决策函数

y ( x ) = s i g n ( ω t ϕ ( x ) + b ) y(x)=sign(\omega^t\phi(x)+b) y(x)=sign(ωtϕ(x)+b)
其中符号函数:
s i g n ( x ) = { − 1 x < 0 0 x = 0 + 1 x > 0 sign(x)=\begin{cases} -1 &x<0 \\ 0&x=0 \\ +1&x>0 & \end{cases} sign(x)=10+1x<0x=0x>0
综上所述:
y ( x ) = s i g n ( ω t ϕ ( x ) + b ) y(x)=sign(\omega^t\phi(x)+b) y(x)=sign(ωtϕ(x)+b)
当样本正确时,满足:
y ( x i ) > 0 (y=+1) y(x_i)>0\tag{y=+1} y(xi)>0(y=+1)
y ( x i ) < 0 (y=-1) y(x_i)<0\tag{y=-1} y(xi)<0(y=-1)
y ∗ y ( x i ) > 0 y*y(x_i)>0 yy(xi)>0

距离问题;

(1)点到直线的距离:
d = ω 1 λ 1 + ω 2 x 2 + b ( ω 1 2 + ω 2 2 ) d = \frac{\omega_1\lambda_1+\omega_2x_2+b}{\sqrt (\omega_1^2+\omega_2^2)} d=( ω12+ω22)ω1λ1+ω2x2+b

(2)点到平面的距离:
d = ω 1 λ 1 + ω 2 x 2 + ω 3 x 3 + b ( ω 1 2 + ω 2 2 + ω 3 3 ) d = \frac{\omega_1\lambda_1+\omega_2x_2+\omega_3x3+b}{\sqrt (\omega_1^2+\omega_2^2+\omega_3^3)} d=( ω12+ω22+ω33)ω1λ1+ω2x2+ω3x3+b

(3)点到超平面的距离:
d = ω 1 λ 1 + ω 2 x 2 + ω 3 x 3 + ⋯ + ω n x n + b ( ω 1 2 + ω 2 2 + ω 3 2 + ⋯ + ω n 2 ) d = \frac{\omega_1\lambda_1+\omega_2x_2+\omega_3x3+\dots+\omega_nx_n+b}{\sqrt (\omega_1^2+\omega_2^2+\omega_3^2+\dots+\omega_n^2)} d=( ω12+ω22+ω32++ωn2)ω1λ1+ω2x2+ω3x3++ωnxn+b

简化为:
y ( x i ) = 1 ∥ ω ∥ ( ω t ϕ ( x i ) + b ) (确信度,点到超平面的距离) y(x_i)=\frac{1}{\lVert\omega \lVert}(\omega^t\phi(x_i)+b)\tag{确信度,点到超平面的距离} y(xi)=ω1(ωtϕ(xi)+b)()

对公式进行改进:
y ( x i ) = 1 ∥ ω ∥ y i ( ω t ϕ ( x i ) + b ) y(x_i)=\frac{1}{\lVert\omega \lVert}y_i(\omega^t\phi(x_i)+b) y(xi)=ω1yi(ωtϕ(xi)+b)
使得:
y i y ( x i ) > 0 y_iy(x_i)>0 yiy(xi)>0

最优超平面

找到距离超平面最近的点

y ( x i ) = m i n i . . . 1 ∥ ω ∥ y i ( ω t ϕ ( x i ) + b ) y(x_i)=min_i...\frac{1}{\lVert\omega \lVert}y_i(\omega^t\phi(x_i)+b) y(xi)=mini...ω1yi(ωtϕ(xi)+b)
最大距离:
m a x ω , b y [ ( x i ) ] max_\omega,_by[(x_i)] maxω,by[(xi)]

使得离超平面最近的点到超平面的距离越远越好
在这里插入图片描述

损失函数求解

y ( x i ) = m a x ω , b [ m i n i 1 ∥ ω ∥ y i ( ω t ϕ ( x i ) + b ) ] y(x_i)=max_\omega,_b[min_i\frac{1}{\lVert\omega \lVert}y_i(\omega^t\phi(x_i)+b)] y(xi)=maxω,b[miniω1yi(ωtϕ(xi)+b)]
(1)令
m i n ( y i ( ω t ϕ ( x i ) + b ) ) = 1 min(y_i(\omega^t\phi(x_i)+b))= 1 min(yi(ωtϕ(xi)+b))=1
(2)优化函数:
a r g m a x ω , b 1 ∥ ω ∣ argmax_\omega,_b\frac{1}{\lVert\omega\lvert} argmaxω,bω1
y i ( ω t ϕ ( x i ) + b ) ≥ 1 y_i(\omega^t\phi(x_i)+b)\geq1 yi(ωtϕ(xi)+b)1

超平面函数可视化

y i ( ω t ϕ ( x i ) + b ) ≥ 1 y_i(\omega^t\phi(x_i)+b)\geq1 yi(ωtϕ(xi)+b)1

在这里插入图片描述

拉格朗日乘子法:

求解有约束条件的极值:
在这里插入图片描述

函数优化求解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

举例说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由计算可知,真正发挥作用的为 α \alpha α不等于0的点,这些点为支持向量
在这里插入图片描述

软间隔

在这里插入图片描述
在这里插入图片描述

求解带软间隔的函数

在这里插入图片描述
在这里插入图片描述

核函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

常见核函数

在这里插入图片描述

高项式核函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SVM优缺点

优点:

  1. 有严格的数学理论支持,可解释性强,不同于传统的统计方法能简化我们遇到的问题
  2. 能找出对任务有关键影响的样本,即支持向量。
  3. 软间隔可以有效松弛目标函数。
  4. 核函数可以有效解决非线性问题。
  5. 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避 免了“维数灾难”。
  6. SVM在小样本训练集上能够得到比其它算法好很多的结果。

缺点:

  1. 对大规模训练样本难以实施。SVM的空间消耗主要是存储训练样本和核矩阵,当样本数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。超过十万及以上不建议使用SVM。
  2. 对参数和核函数选择敏感。支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造SVM算法。目前没有好的解决方法解决核函数的选择问题。
  3. 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

参数说明:

class sklearn.svm.SVC
(C=1.0, kernel=’rbf’, degree=3, gamma=’auto_deprecated’, 
coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200,
 class_weight=None, verbose=False, max_iter=-1, decision_function_shape=’ovr’, random_state=None)
  1. C :惩罚因子【浮点数,默认为1.】【软间隔】
    (1)C越大,对误分类的惩罚增大,希望松弛变量接近0,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱;
    (2)C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
    ->>建议通过交叉验证来选择
  2. kernel: 核函数【默认rbf(径向基核函数|高斯核函数)】
    可以选择线性(linear)、多项式(poly)、sigmoid
    ->>多数情况下选择rbf
  3. degree:【整型,默认3维】
    多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
    ->>按默认【选择rbf之后,此参数不起作用】
  4. gamma: ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’。
    (1)如果gamma是’auto’,那么实际系数是1 / n_features,也就是数据如果有10个特征,那么gamma值维0.1。(sklearn0.21版本)
    (2)再sklearn0.22版本中,默认为’scale’,此时gamma=1 / (n_features*X.var())
    <1>gamma越大,过拟合风险越高
    <2> gamma越小,过拟合风险越低
    ->>建议通过交叉验证来选择
  5. coef0:核函数中的独立项。 它只在’poly’和’sigmoid’中很重要。probability :是否启用概率估计。 必须在调用fit之前启用它,并且会减慢该方法的速度。默认为False
    ->>按默认即可【选择rbf之后,不起作用】
  6. cache_size :核函数cache缓存大小,默认为200MB
    ->>不用调整

重要的参数有:C、kernel、degree、gamma

属性说明:

  1. support_vectors_ 【支持向量】
    ->>以数组的形式储存

  2. n_support_ 【每个类别支持向量的个数】
    ->>int类型

  3. coef_ 【参数w】
    ->>数组的形式储存

  4. intercept_ 【偏置项参数b】
    ->>数组的形式储存

代码演示

#读取文件
import pandas as pd
data = pd.read_csv('iris.csv',header=None)
#只需要对两种不同的数据进行划分,此问价数据有4列,故需要先切分数据
data1 = data.iloc[:50,:]
data2 = data.iloc[50:,:]
# print(data1.head())

#可视化数据,选取两个坐标
import matplotlib.pyplot  as plt
plt.scatter(data1[1],data1[3],marker='+')
plt.scatter(data2[1],data2[3],marker='o')



#训练数据
from sklearn.svm import SVC

svm = SVC(kernel='linear',C=float('inf'),random_state=0)  #线性内核,间隔设置无限大

#数据处理
X = data.iloc[:,[1,3]]  #两列数据
y = data.iloc[:,-1]  #最后一列的结果数据

svm.fit(X, y)
"""
可视化SVM结果
"""
#参数w[原始数据为二维数组]
# print(svm.coef_)
w = svm.coef_[0]
#偏置项b[原始数据为一维数组]
b = svm.intercept_[0]
# print(svm.intercept_)
#超平面方程:w1x1+w2x2+b=0 下-1,上1
#x2 = -(w1x1+b)/w2

import numpy as np
x1 = np.linspace(0,7,300)  #在0到7中平均选300个点出来
#通过刚刚的两个参数算出x2的值
#超平面:
x2 = -(w[0]*x1+b)/w[1]

#上超平面:
x3 = (1-(w[0]*x1+b))/w[1]


#下超平面:
x4 = (-1-(w[0]*x1+b))/w[1]

#找到支持向量[二维数组]
vets = svm.support_vectors_

#画出超平面
plt.plot(x1,x2,linewidth=2,color='r')
plt.plot(x1,x3,linewidth=1,color='r',linestyle='--')
plt.plot(x1,x4,linewidth=1,color='r',linestyle='--')

#可视化支持向量(这些点位关键点)
plt.scatter(vets[0][0],vets[0][1],color='red')
plt.scatter(vets[1][0],vets[1][1],color='red')
plt.scatter(vets[2][0],vets[2][1],color='red')


plt.show()

初始化的数据集

在这里插入图片描述

总结果展示

在这里插入图片描述

更改惩罚因子:软间隔

import pandas as pd

data = pd.read_csv(r"C:\Users\wwb\Desktop\iris.csv",header=None)

"""
可视化原始数据
"""
import matplotlib.pyplot as plt

data1 = data.iloc[:50,:]        
data2 = data.iloc[50:,:] 
#原始数据是四维,无法展示,选择两个进行展示
plt.scatter(data1[1],data1[4],marker='+')
plt.scatter(data2[1],data2[4],marker='o')

"""
使用SVM进行训练
"""
from sklearn.svm import SVC

X = data.iloc[:,[1,4]]
y = data.iloc[:,-1]
svm = SVC(kernel='linear',C=float(0.1),random_state=0)
svm.fit(X,y)

"""
可视化SVM结果
"""
#参数w[原始数据为二维数组]
w = svm.coef_[0]
#偏置项b[原始数据为一维数组]
b = svm.intercept_[0]
#超平面方程:w1x1+w2x2+b=0
#->>x2 = -(w1x1+b)/w2
import numpy as np

x1 = np.linspace(0,7,300)
#超平面方程
x2 = -(w[0]*x1+b)/w[1]
#上超平面方程
x3 = (1-(w[0]*x1+b))/w[1]
#下超平面方程
x4 = (-1-(w[0]*x1+b))/w[1]
#找到支持向量[二维数组]
vets = svm.support_vectors_

#可视化原始数据
plt.scatter(data1[1],data1[4],marker='+',color='b')
plt.scatter(data2[1],data2[4],marker='o',color='b')
#可视化超平面
plt.plot(x1,x2,linewidth=2,color='r')
plt.plot(x1,x3,linewidth=1,color='r',linestyle='--')
plt.plot(x1,x4,linewidth=1,color='r',linestyle='--')
#进行坐标轴限制
plt.xlim(4,7)
plt.ylim(0,2)
#可视化支持向量
plt.scatter(vets[:, 0], vets[:, 1], c='r', marker='x')
plt.show()

结果展示

在这里插入图片描述

不同参数的训练结果

"""
高斯核函数的参数对超平面的影响
"""
from sklearn import svm
#生成数的模块儿
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
import numpy as np

"""
超平面绘制函数
clf:SVM分类器
X:训练数据特征
y:训练数据标签
h:有关决策边界的绘制【设置为0.02即可】
draw_sv:是否绘制支持向量
title:图像的标题
"""
def plot_hyperplane(clf, X, y,
                    h=0.02,
                    draw_sv=True,
                    title='hyperplan'):
    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))

    plt.title(title)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.xticks(())
    plt.yticks(())

    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap='hot', alpha=0.5)

    markers = ['o', 's', '^']
    colors = ['b', 'r', 'c']
    labels = np.unique(y)
    for label in labels:
        plt.scatter(X[y==label][:, 0],
                    X[y==label][:, 1],
                    c=colors[label],
                    marker=markers[label])
    # 画出支持向量
    if draw_sv:
        sv = clf.support_vectors_
        plt.scatter(sv[:, 0], sv[:, 1], c='y', marker='x')


#生成数据
X, y = make_moons(n_samples=150, noise=0.15, random_state=42)

#实例化不同的svm分类器
clf_rbf1 = svm.SVC(C=1, kernel='rbf', gamma=0.01)
clf_rbf2 = svm.SVC(C=1, kernel='rbf', gamma=5)
clf_rbf3 = svm.SVC(C=100, kernel='rbf', gamma=0.01)
clf_rbf4 = svm.SVC(C=100, kernel='rbf', gamma=5)
clf_rbf5 = svm.SVC(C=10000, kernel='rbf', gamma=0.01)
clf_rbf6 = svm.SVC(C=10000, kernel='rbf', gamma=5)
#设置图像大小
plt.figure(figsize=(10, 10), dpi=144)

#做一个分类器列表
clfs = [ clf_rbf1, clf_rbf2, clf_rbf3, clf_rbf4, clf_rbf5, clf_rbf6]
#每个图像的标题
titles = ['C=1,gamma=0.01',
          'C=1,gamma=5',
          'C=100,gamma=0.01',
          'C=100,gamma=5',
          'C=10000,gamma=0.01',
          'C=10000,gamma=5']
#遍历所有的分类器,然后进行绘图展示
for clf, i in zip(clfs, range(len(clfs))):
    clf.fit(X, y)
    plt.subplot(3, 2, i+1)
    plot_hyperplane(clf, X, y, title=titles[i])
plt.show()

效果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值