【支持向量机SVM】 算法原理 公式推导 python编程实现 | 您所在的位置:网站首页 › 支持向量机公式解析 › 【支持向量机SVM】 算法原理 公式推导 python编程实现 |
1.前言
学习笔记,即TensorFlow实现源码地址:https://github.com/lsq960124/DeepLearning/blob/master/TensorFlow%20notes/TensorFlow%20basis04%20SVM.ipynb 如图,对于一个给定的数据集,通过直线A或直线B(多维坐标系中为平面A或平面B)可以较好的将红点与蓝点分类。那么线A与线B那个更优呢?
在SVM算法中,我们认为线A是优于线B的。因为A的‘分类间隔’大于B。 那么什么是分类间隔呢? 以A线所在图为例,平移直线A直到找到一个极限位置,越过该位置,就会产生分类错误的现象。如图,直线A左右两边的直线就是所谓的极限位置,再往左或者往右移动一下直线都会出现分类错误的情况。这2条直线之前的垂直距离就是分类间隔。(2d) 而这2条直线中间的分界线也是分类间隔中心所在的直线就是SVM的‘最优决策面’ 而这两条直线上面的点,我们称之为‘支持向量’ 通俗一点来说,SVM的分类目的就是找到最大的分类间隔即使得2倍的d最大。 2.SVM的最优化问题
首先回顾一下初中便开始接触的知识: 对于求坐标系中任意点 把这个原理应用在N维的空间会怎样?首先N维空间的曲线我们可以用一个我们熟知的式子来表示: 那么空间中任意一点到曲线的距离可以表示为: 其中: 我们令左侧的数据的类别为-1,及对应决策平面左侧的点 你不用去在意为什么是-1和1,实质上你可以令其为任何你想的数,只是用1和-1会在之后的计算中更为简便一些。 那么决策平面A左右2侧的极限位置外的点我们就可以这样表示: 移项: 我们令 那么原式就可以转化为: 对于决策平面A我们也可以用同样的方式表示: 这里有个技巧性的办法,因为我们之前令 为了之后的便于书写,通常情况下,在这个时候,我们会直接设 *这里的 *记住在这之后的 这样之后 就转化为了 所以我们求最大分割间隔的长度问题就可以表示为: 而我们知道决策平面平移的极限条件为 通常情况下我们不会去求
我们梳理一下重点内容,通过上面的推到,我们把一个分类的问题转化为了一个最优化问题, 3.解决SVM最优化问题
上一节我们由分类间隔的思想得到一个最优化问题。这节将以纯数学的方式和大家一起解决这个最优化问题。 首先需要为大家介绍一下,拉格朗日算子。 百度百科: 在数学最优化问题中,拉格朗日乘数法(以数学家约瑟夫·路易斯·拉格朗日命名)是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。这种方法将一个有n 个变量与k 个约束条件的最优化问题转换为一个有n + k个变量的方程组的极值问题,其变量不受任何约束。这种方法引入了一种新的标量未知数,即拉格朗日乘数:约束方程的梯度(gradient)的线性组合里每个向量的系数。 拉格朗日算子的定义是生涩不易懂的,所以这里我将用一个例题来让对SVM中拉格朗日算子的作用有更深刻的认识: 例:给定椭球 解:建立拉普拉斯算式,算式的偏导为0 联立四个方程: 代入 于是得到: 同样以拉格朗日的算子的原理来求解我们SVM分类的最优化问题: 由拉格朗日算子定义可以转化成: 其中 得到结果: 将这2个结果代入 所以我们的最优化问题就转化为了:
在第三节中,我们将最优化问题使用拉格朗日算子进行了转化,在这一小节要介绍的是SVM的核函数,了解SVM是怎么通过核函数减少欠拟合和过拟合现象的。 首先观察式子 发现这个式子会对每个 我们设具有多项式特征的 那么求解具有多项式特征的SVM分类器的最优化问题就转化为: 而这个函数 如果不使用核函数,那么我们需要先将 从这一点可以看出核函数并不是SVM的专用方法,实质上在我们求解最优化问题上遇到 4.0线性核函数: 4.1多项式核函数(poly): 我们以2次项为例子,如果我们直接算 通过上面这个式子,我们可以直接理解为我们将原来的 而使用到核函数这种方法,我们就直接将x,y带入 回到这个我们最优化问题中: 我们只用将
4.2高斯核函数(rbf): 首先我们介绍下高斯函数: 高斯核的转化方式如上图:双曲线与坐标轴的交点为 关于高斯核函数的解释我使用可视化的方式我觉得这样可以方便理解:使用工具python的numpy和matpoltlib import numpy as np import matplotlib.pyplot as plt #定义一个从-4到5分布的数值,分割间隔为1 In [1]:x=np.arange(-4,5,1) Out[1]: array([-4, -3, -2, -1, 0, 1, 2, 3, 4]) #将-2到2之间的点归为一类,类别为1,将小于-2和大于2的点归为一类,类别为0 In [2]:y=np.array((x>=-2)&(x |
CopyRight 2018-2019 实验室设备网 版权所有 |