SVM模型

  • 一、模型介绍
    • 01 超平面
    • 02 距离计算
    • 03 SVM模型思想
  • 二、线性可分SVM模型
    • 01 目标函数
    • 02 拉格朗日乘子法
    • 03 代码函数
  • 三、非线性可分SVM模型
    • 01 目标函数
    • 02 代码函数
  • 四、代码实现

一、模型介绍

01 超平面

在一维空间中,若需要将数据切分为两段,只需要一点即可;在二维空间中,对于线性可分的样本,将其切分为两类只需一条直线即可;在三维空间中,将样本切分开来,就需要一个平面。

02 距离计算

点到线的距离:
d=∣Ax0+By0+C∣A2+B2d=\frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}} d=A2+B2​∣Ax0​+By0​+C∣​
平行线间的距离:
d=∣C1−C2∣A2+B2d=\frac{|C_1-C_2|}{\sqrt{A^2+B^2}} d=A2+B2​∣C1​−C2​∣​

03 SVM模型思想

假设上图中间红线lll为分割面,为了使其达到最优,有以下三个步骤:

  1. 计算左右两个类别中的样本点到直线的距离
  2. 从两组距离中各挑选出一个最短的d1d_1d1​和d2d_2d2​;继续比较d1d_1d1​和d2d_2d2​,选出其中最短的,以该距离构造分隔带
  3. 利用无穷多个分割直线lil_ili​,构造无穷多个“分隔带”,并从这些分隔带中挑选出宽最大的lll

分隔带:

“分隔带”代表了模型划分样本点的能力和可信度,“分隔带”越宽,说明模型能够将样本点划分得越清晰,进而保证模型的泛化能力越强。

目标函数:
J(w,b,i)=argw,bmaxmin(di)J(w,b,i)=arg_{w,b}maxmin(d_i) J(w,b,i)=argw,b​maxmin(di​)
其中,did_idi​表示样本点i到某条固定分割面的距离;min(di)min(d_i)min(di​)表示所有样本点与某个分割面之间距离的最小值;argw,bmaxmin(di)arg_{w,b}maxmin(d_i)argw,b​maxmin(di​)表示从所有分割面中寻找“分割带”最宽的“超平面”;其中w,bw,bw,b代表线性分割面的参数。

上图所示,将五角星和圆点分别表示负例样本和正例样本,两条虚线与分割面w′x+b=0w'x+b=0w′x+b=0平行,虚线分别表示因变量y取值为-1和+1的情况。

那么,不管是五角星还是圆点,这些样本点均落在两条虚线之上或之外,则说明这些点带人方程w′x+bw'x+bw′x+b所得绝对值一定大于等于1.

进而说明若某一样本点取值越小于-1,则该样本为负例的可能性越高;点对应的取值越大于+1,样本为正例的可能性越高。
γi^=yi×(w′xi+b)\hat{\gamma_i}=y_i\times(w'x_i+b) γi​^​=yi​×(w′xi​+b)
其中,yiy_iyi​表示样本的所属类别,用-1和+1表示。故利用上述公式即可得到线性可分的SVM所对应的函数间隔满足γ^≥1\hat{\gamma}\geq1γ^​≥1的条件。

当分割面中的参数w和b同比例增加时,所对应的γi^\hat{\gamma_i}γi​^​值也会同比例增加,但这样的增加对分割面w′x+b=0w'x+b=0w′x+b=0来说却丝毫没有影响。因此,为了避免上述问题,需要对函数间隔做约束,例如单位化处理:
γi^=γi^∥w∥=yi×(w′xi+b)∥w∥=∣w′xi+b∣∥w∥=di\hat{\gamma_i}=\frac{\hat{\gamma_i}}{\|w\|}=\frac{y_i\times(w'x_i+b)}{\|w\|}=\frac{|w'x_i+b|}{\|w\|}=d_i γi​^​=∥w∥γi​^​​=∥w∥yi​×(w′xi​+b)​=∥w∥∣w′xi​+b∣​=di​

二、线性可分SVM模型

01 目标函数

J(w,b,i)=argw,bmaxmin(di)=argw,bmax1∥w∥min(yi×(w′xi+b))=argw,bmax1∥w∥min(γi^)J(w,b,i)=arg_{w,b}maxmin(d_i)=arg_{w,b}max\frac{1}{\|w\|}min(y_i\times(w'x_i+b))=arg_{w,b}max\frac{1}{\|w\|}min(\hat{\gamma_i}) J(w,b,i)=argw,b​maxmin(di​)=argw,b​max∥w∥1​min(yi​×(w′xi​+b))=argw,b​max∥w∥1​min(γi​^​)

而γi^\hat{\gamma_i}γi​^​满足大于等于1,故可将目标函数等价为如下表达式:
{max1∥w∥s.t.yi×(w′xi+b)≥1\begin{cases}max\frac{1}{\|w\|}\\s.t.\ \ y_i\times(w'x_i+b)\geq1\end{cases} {max∥w∥1​s.t.  yi​×(w′xi​+b)≥1​
由于最大化1∥w∥\frac{1}{\|w\|}∥w∥1​与最小化12∥w∥2\frac{1}{2}\|w\|^221​∥w∥2等价,故可以将上面的表达式重新表示为:
{min12∥w∥2s.t.yi×(w′xi+b)≥1\begin{cases}min\frac{1}{2}\|w\|^2\\s.t.\ \ y_i\times(w'x_i+b)\geq1\end{cases} {min21​∥w∥2s.t.  yi​×(w′xi​+b)≥1​

02 拉格朗日乘子法

假设存在一个需要最小化的目标函数f(x),并且该目标函数同时受到g(x)<=0的约束。如需要得到最优解,则需要利用拉格朗日对偶性将原始的最优化问题转换为对偶问题,即:
min(f(x))=minxmaxλ(L(x,λ))=minxmaxλ(f(x)+∑i=1kλigi(x))=maxλminx(f(x)+∑i=1kλig1(x))min(f(x))=min_xmax_\lambda(L(x,\lambda))=min_xmax_\lambda(f(x)+\sum_{i=1}^k\lambda_ig_i(x))=max_\lambda min_x(f(x)+\sum_{i=1}^k\lambda_ig_1(x)) min(f(x))=minx​maxλ​(L(x,λ))=minx​maxλ​(f(x)+i=1∑k​λi​gi​(x))=maxλ​minx​(f(x)+i=1∑k​λi​g1​(x))
其中,f(x)+∑i=1kλigi(x)f(x)+\sum_{i=1}^k\lambda_ig_i(x)f(x)+∑i=1k​λi​gi​(x)为拉格朗日函数;λi\lambda_iλi​为拉格朗日乘子,且λi>0\lambda_i>0λi​>0。

基于上述求解方法,目标函数:
min12∥w∥2=maxαminw,b(L(w,b,αi))=maxαminw,b(12∥w∥2+∑i=1nαi(1−yi×(w′xi+b)))min\frac{1}{2}\|w\|^2=max_\alpha min_{w,b}(L(w,b,\alpha_i))=max_\alpha min_{w,b}(\frac{1}{2}\|w\|^2+\sum_{i=1}^n\alpha_i(1-y_i\times(w'x_i+b))) min21​∥w∥2=maxα​minw,b​(L(w,b,αi​))=maxα​minw,b​(21​∥w∥2+i=1∑n​αi​(1−yi​×(w′xi​+b)))
其中,
g(x)=1−yi×(w′xi+b)g(x)=1-y_i\times(w'x_i+b) g(x)=1−yi​×(w′xi​+b)
进一步化简得:
min12∥w∥2=maxαminw,b(12∥w∥2+∑i=1nαi−∑i=1nαiyi(w′xi+b))min\frac{1}{2}\|w\|^2=max_\alpha min_{w,b}(\frac{1}{2}\|w\|^2+\sum_{i=1}^n\alpha_i-\sum_{i=1}^n\alpha_iy_i(w'x_i+b)) min21​∥w∥2=maxα​minw,b​(21​∥w∥2+i=1∑n​αi​−i=1∑n​αi​yi​(w′xi​+b))
求偏导:
{∂L(w,b,α)∂w=w−∑i=1naiyixi=0∂L(w,b,α)∂b=∑i=1nαiyi=0\begin{cases}\frac{\partial L(w,b,\alpha)}{\partial w}=w-\sum_{i=1}^na_iy_ix_i=0\\\frac{\partial L(w,b,\alpha)}{\partial b}=\sum_{i=1}^n\alpha_iy_i=0\end{cases} {∂w∂L(w,b,α)​=w−∑i=1n​ai​yi​xi​=0∂b∂L(w,b,α)​=∑i=1n​αi​yi​=0​
将导函数反待入目标函数:
min12∥w∥2=maxα(−12∑i=1n∑j=1nαiαjyiyj(xi.xj)+∑i=1nαi−0)min\frac{1}{2}\|w\|^2=max_\alpha(-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_j(x_i.x_j)+\sum_{i=1}^n\alpha_i-0) min21​∥w∥2=maxα​(−21​i=1∑n​j=1∑n​αi​αj​yi​yj​(xi​.xj​)+i=1∑n​αi​−0)
其中,(xi.xj)(x_i.x_j)(xi​.xj​)表示两个样本点的内积,最终根据已知样本点(xi,yj)(x_i,y_j)(xi​,yj​)计算12∑i=1n∑j=1nαiαjyiyj(xi.xj)+∑i=1nαi−0\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_j(x_i.x_j)+\sum_{i=1}^n\alpha_i-021​∑i=1n​∑j=1n​αi​αj​yi​yj​(xi​.xj​)+∑i=1n​αi​−0的极小值,并用拉格朗日乘子αi\alpha_iαi​的值计算分割面w′x+b=0w'x+b=0w′x+b=0的参数w和b:
{w^=∑i=1nαiyixi^b^=yj−∑i=1nαi^yi(xi.yj)\begin{cases}\hat{w}=\sum_{i=1}^n\hat{\alpha_iy_ix_i}\\\hat{b}=y_j-\sum_{i=1}^n\hat{\alpha_i}y_i(x_i.y_j)\end{cases} {w^=∑i=1n​αi​yi​xi​^​b^=yj​−∑i=1n​αi​^​yi​(xi​.yj​)​

03 代码函数

LinearSVC(tol=0.0001, fit_intercept=True, intercept_scaling=1, class_weight=None, max_iter=1000)

  • tol:指定SVM模型迭代的收敛条件
  • fit_intercept:是否拟合线性“超平面”的截距项,默认为True
  • intercept_scalling:当参数fit_intercept为True时,该参数有效,通过给参数传递一个浮点值,就相当于在自变量X矩阵中添加一2常量数列,默认为1
  • class_weight:用于指定因变量类别的权重,若为字典,则通过字典的形式{class_label:weight}传递每个类别的权重;若为字符串’balanced’,则每个分类的权重与实际样本中 比例成反比,当各分类存在严重不平衡时,设置为’balanced’,则会比较好。
  • max_iter:指定模型求解过程中迭代的最大次数

三、非线性可分SVM模型

01 目标函数

对于非线性SVM模型而言,需要经过两个步骤:首先将原始空间中的样本点映射到高维的新空间中,再在新空间中寻找一个用于识别各类别样本点线性“超平面”。

假设原始空间中的样本点为x,将样本通过某种转换ϕ(x)\phi(x)ϕ(x)映射到高维空间中,则非线性SVM模型的目标函数可以表示为:
{minα(12∑i=1n)∑j=1nαiαjyiyj(ϕ(xi).ϕ(xj)−∑i=1nαi)s.t.∑i=1nαiyi=00≤αi≤C\begin{cases}min_\alpha(\frac{1}{2}\sum_{i=1}^n)\sum_{j=1}^n\alpha_i\alpha_jy_iy_j(\phi(x_i).\phi(x_j)-\sum_{i=1}^n\alpha_i)\\s.t.\ \ \sum_{i=1}^n\alpha_iy_i=0\\0\leq\alpha_i\leq C\end{cases} ⎩⎪⎨⎪⎧​minα​(21​∑i=1n​)∑j=1n​αi​αj​yi​yj​(ϕ(xi​).ϕ(xj​)−∑i=1n​αi​)s.t.  ∑i=1n​αi​yi​=00≤αi​≤C​
核函数:

假设原始空间中的两个样本点为(xi,xj)(x_i,x_j)(xi​,xj​),在其扩展到高维空间后,其内积ϕ(xi).ϕ(xj)\phi(x_i).\phi(x_j)ϕ(xi​).ϕ(xj​)如果等于样本点在原始空间中某个函数的输出,则称该函数为核函数。常见的核函数有:线性核函数、多项式核函数、高斯核函数、Sigmoid核函数。

02 代码函数

SVC(C=1, kernel='rbf', degree=3, gamma='auto', coef0=0.0, tol=0.001, class_weight=None, verbose=False, max_iter=-1, random_state=None)

  • C:指定目标函数中松弛因子的惩罚系数值,默认为-1
  • kernel:用于指定SVM模型的核函数,'linear’为线性核函数,'poly’为多项式函数,'rbf’为径向基核函数,'sigmoid’为Sigmoid核函数,'precomputed’表示计算一个核矩阵
  • degree:用于指定多项式核函数中p的参数值
  • gamma:用于指定多项式核函数或径向基核函数、Sigmoid核函数中的r参数值
  • coef0:用于指定多项式核函数或Sigmoid核函数中的r参数值

四、代码实现

# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics
# 读取外部数据
letters = pd.read_csv(r'letterdata.csv')
# 数据前5行
letters.head()
# 将数据拆分为训练集和测试集
predictors = letters.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(letters[predictors], letters.letter, test_size = 0.25, random_state = 1234)
# 选择线性可分SVM模型
linear_svc = svm.LinearSVC()
# 模型在训练数据集上的拟合
linear_svc.fit(X_train,y_train)
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,intercept_scaling=1, loss='squared_hinge', max_iter=1000,multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,verbose=0)
# 模型在测试集上的预测
pred_linear_svc = linear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test, pred_linear_svc)

out: 0.5802

# 选择非线性SVM模型
nolinear_svc = svm.SVC(kernel='rbf')
# 模型在训练数据集上的拟合
nolinear_svc.fit(X_train,y_train)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape='ovr', degree=3, gamma='auto_deprecated',kernel='rbf', max_iter=-1, probability=False, random_state=None,shrinking=True, tol=0.001, verbose=False)
# 模型在测试集上的预测
pred_svc = nolinear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test,pred_svc)

out: 0.9734

故此数据应采用非线性SVM模型进行拟合。

数据分析 | SVM模型相关推荐

  1. R语言SVM支持向量机模型数据分类实战:探索性数据分析、模型调优、特征选择、核函数选择

    R语言SVM支持向量机模型数据分类实战:探索性数据分析.模型调优.特征选择.核函数选择 目录 R语言SVM支持向量机模型数据分类实战:探索性数据分析.模型调优.特征选择.核函数选择 ​ #SVM基本原 ...

  2. R语言书籍学习02 《R语言数据分析、挖掘建模与可视化》-第十三章 SVM模型

    SVM模型(Support Vector Machine, 支持向量机)属于一种有监督的机器学习算法,可用于离散因变量的分类和连续因变量的预测. 它可以将低维线性不可分的空间转换为高维的线性可分空间. ...

  3. r语言 svm 大样本_R语言数据分析实战:十大算法之SVM模型 - 数据分析

    一.SVM简介 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类.以及回归分析. SVM的主要思想可以概括为两点: ⑴ ...

  4. python应用(3)svm模型预测股票涨跌

    最近接了一个私活,指导学妹完成毕业设计.核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置. 在做这个项目的过程中,我体会到想成为一个合格的数据分析或者数据挖 ...

  5. python 中任务 6.3 构建并评分分类模型(SVM模型) 学习笔记3

    文章目录 任务6.3 构建并评价分类模型 6.3.1 使用sklearn 估计器构建分类模型 代码6-17 使用sklearn估计器构建SVM模型 sklearn 库常用分类算法函数 代码 6-18 ...

  6. R语言e1071包中的支持向量机:仿真数据(螺旋线性不可分数据集)、简单线性核的支持向量机SVM(模型在测试集上的表现、可视化模型预测的结果、添加超平面区域与原始数据标签进行对比分析)、如何改进核函数

    R语言e1071包中的支持向量机:仿真数据(螺旋线性不可分数据集).简单线性核的支持向量机SVM(模型在测试集上的表现.可视化模型预测的结果.添加超平面区域与原始数据标签进行对比分析).如何改进核函数 ...

  7. 支持向量机SVM模型中C和gamma参数分别是什么?对模型有什么影响?

    支持向量机SVM模型中C和gamma参数分别是什么?对模型有什么影响? SVM模型有两个非常重要的参数C与gamma. C的本质是正则化系数. C值是惩罚系数或者叫惩罚因子,表征的是模型对于误差的容忍 ...

  8. python利器app怎么查文献-科研人必备:一个工具搞定文献查阅、数据分析、模型搭建...

    原标题:科研人必备:一个工具搞定文献查阅.数据分析.模型搭建 写论文有多难?这首诗形容得好: 进入学校先选题,踌躇满志万人敌:发现前辈都做过,满脸懵逼加惊奇. 终于找到大空白,我真是个小天才:左试右试 ...

  9. 5.7 程序示例--基于 SMO 的 SVM 模型-机器学习笔记-斯坦福吴恩达教授

    程序示例–基于 SMO 的 SVM 模型 在这里,我们会实现一个基于 SMO 的 SVM 模型,在其中,提供了简化版 SMO 和 完整版 SMO 的实现. 简化版 SMO:不使用启发式方法选择 (α( ...

最新文章

  1. AI领域五年引用量最高的10大论文:Adam登顶,AlphaGo、Transfromer上榜
  2. python加载函数包_Python wrapt包_程序模块 - PyPI - Python中文网
  3. CF 295A - Greg and Array 差分數列
  4. CertUtil.exe被利用来下载恶意软件
  5. 27-1/x+1/y=1/n
  6. SSM框架之Spring MVC(一)
  7. 51nod 1135 原根(原根)
  8. python连接informix数据库
  9. android屏幕截图代码,android中实现整个屏幕截图的代码
  10. 科研ABC - 文献检索
  11. MFC实现文字随鼠标移动
  12. linux filesystem not open,LVM 'Can’t open /dev/sdb1 exclusively. Mounted filesystem?' Problem
  13. 基于eigen实现matlab hamming hann blakman 窗函数的实现
  14. 关于防止游戏行为检测的几点建议技巧
  15. VMware虚拟化- vCenter CPU 内存 资源池和vAPP理论及应用
  16. 用Meta标签代码让360双核浏览器默认极速模式
  17. 源代码转换:Tangible Software Solutions v22.10.20
  18. 第一次视频面试给了小米前端
  19. myeclipse10下载问题
  20. 华为交换机不同网段互访_FAQ-傻瓜交换机是否可以连接不同的网段的终端实现互访...

热门文章

  1. 泛在电力物联网建设路线
  2. 【Unity游戏开发教程】零基础带你从小白到超神21——线和拖尾
  3. 小米/红米卡刷进入开发版(以红米5 plus为例)
  4. 系统安全-Windows下的注册表操作
  5. Python中如何输出换行?
  6. VBA---EXcel工具栏及控件对象、助手对象、内置对话框对象介绍
  7. C++中函数返回数组指针的几种方法总结
  8. 一个好用的JSON转义工具网站,用于C开发
  9. 如何设置Android中TextView的行间距
  10. 密码控件解密流程和原理