SVM -支持向量机原理详解与实践之四

SVM -支持向量机原理详解与实践之四

  1. SVM原理分析

    1. SMO算法分析

SMO即Sequential minmal optimization, 是最快的二次规划的优化算法,特使对线性SVM和稀疏数据性能更优。在正式介绍SMO算法之前,首先要了解坐标上升法。

  1. 坐标上升法(Coordinate ascent)

坐标上升法(Coordinate Ascent)简单点说就是它每次通过更新函数中的一维,通过多次的迭代以达到优化函数的目的。

  1. 坐标上升法原理讲解

为了更加通用的表示算法的求解过程,我们将算法表示成:

 


(3.13-1)

坐标上升法的算法为:

这个算法中最为关键的地方就是内循环对于的求解,意思是固定除了之外的所有a(从i=1~m),也就是说将除外的其他变量看成是常数,并且将W看做是关于的函数,那么直接对求导优化得到极大值,在上面算法的版本中,内循环优化变量的顺序是但是一个更高级的版本可能选择其它的顺序,例如我可以根据我们的期望来选择下一个变量来更新,并让W(a)有最大的增加。

当函数W在内循环中能够最快的达到最优,则坐标上升是一个有效的算法,下面是一个坐标上升的示意图:

上图中的椭圆形线代表我们需要优化问题的二次函数的等高线,变量数为2,起始坐标是(2,2),途中的直线是迭代优化的路径,可以看到每一步都会相最优值前进一步,而且前进的路线都是平行与相应的坐标轴的,因为每次只优化一个变量。

  1. C++算法编程实践

问题:求解函数的最大值。

解:回顾我们前面分析的求取函数最大值的关键是,求解每一个迭代变量的导数,当求解某一变量的导数的时候,其他的变量看做是常数:

VS2013控制台工程参考代码如下:

// Coordinate ascent.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <iostream>

using namespace std;

#define f(x1,x2,x3) (-x1*x1-2*x2*x2-3*x3*x3+2*x1*x2+2*x1*x3-4*x2*x3+6)

int _tmain(int argc, _TCHAR* argv[])

{

double x1 = 1;

double x2 = 1;

double x3 = 1;

double f0 = f(x1, x2, x3);

double err = 1.0e-10;

while (true)

{

x1 = x2 + x3; //对x1求导的表达式,每次迭代后更新

x2 = 0.5*x1 - x3; //对x2求导的表达式,每次迭代后更新

x3 = 1.0 / 3 * x1 - 2.0 / 3 * x2; //对x3求导的表达式,每次迭代后更新

double ft = f(x1, x2, x3); //求函数值

if (abs(ft - f0)<err) //判断f是否收敛

{

break; //收敛即完成求解过程

}

f0 = ft; //更新f0

}

cout << "\nmax{f(x1,x2,x3)}=" << f(x1, x2, x3) << endl;

cout << "取得最大值时的坐标:\n(x1,x2,x3)=(" << x1 << "," << x2 << "," << x3 << ")" << endl;

system("pause");

return 0;

}

运行结果如下:

  1. SMO算法详解

回到我们软间隔与正则化章节(还有最优间隔分类器),我们的对偶问题,就是通过固定拉格朗日乘子a,得到w和b的最优化表达式(关于a的表达式),所以最后我们只需要确认a,我们就可以最终确定w和b,但是在讨论SMO算法之前,我们并没有真正求解出。这一章我们就会通过介绍SMO算法对对偶问题最后需要解决的问题:

做出一个求解,也就是在参数上求W最大值的问题,注意其中的就是训练样本的输入,x即为样本的输入特征,y即样本对应的标签(结果)。

按照前面介绍的坐标上升的思路,我们首先固定除了以外的所有参数,然后在上求极值。现在下面先固定以外的所有参数,看看具体的求解步骤:

  1. 首先由优化问题的约束条件可知:

即可推出

 

 

两边乘以:


 
 


(3.13.2-1)

因为,所以,因此到这一步,就由其它的决定,如果我们固定主,无论如何不能违背优化问题的约束

因此如果我们想要更新一些的对象,为了保持满足约束条件就必须至少快速的更新它们中的两个,这个就激发出SMO算法,那么SMO算法可以简单的描述成:

重复大括号中的操作直到收敛{

  1. 选择一对来更新下一个(用启发式的方法,也就是尝试选取两个允许我们朝着全局最大方向做最大前进的参数)。
  1. 固定所有其它的参数,优化关于的函数W(a)。

}

为了测试该算法的收敛性,我们可以检查KKT条件:

是否满足收敛容错参数,典型值为0.1~0.001之间。

SMO作为一个高效的算法的关键原因在于计算更新的效率非常高。假设当前我们有一些满足(3.10.3-5)的约束,固定,想要优化关于的函数,用表示有:

 

 

由于右边固定,我们可以直接用一个常数表示,例如用表示:

于是我可以将的约束画出来:

根据约束条件:

可知上图中表示的横轴和纵轴必须限制在0到C的方框内,并且也要在直线上。并且的纵轴也必须满足,否则就不能满足约束条件。

下面用表示,过程是:

其中,因为,所以有:

所以目标问题W可以表示为:

其中为常数。

实际的问题中W展开后就是一个关于的二次函数, A、B、C是固定值,这样通过对W进行求导可得,然而要保证满足,我们使用 表示求导求出的, 然而最后的,需要根据下面的情况得到:

求出以后,我们可以就可以得到

  1. 支持向量机实践

这里限于篇幅,实践的内容将在下一篇展开…

时间: 2024-10-15 16:30:29

SVM -支持向量机原理详解与实践之四的相关文章

SVM -支持向量机原理详解与实践之二

SVM -支持向量机原理详解与实践之二 SVM原理分析 以下内容接上篇. 拉格朗日对偶性(Largrange duality)深入分析 前面提到了支持向量机的凸优化问题中拉格朗日对偶性的重要性. 因为通过应用拉格朗日对偶性我们可以寻找到最优超平面的二次最优化, 所以以下可以将寻找最优超平面二次最优化(原问题),总结为以下几个步骤: 在原始权重空间的带约束的优化问题.(注意带约束) 对优化问题建立拉格朗日函数 推导出机器的最优化条件 最后就是在对偶空间解决带拉格朗日乘子的优化问题. 注:以上这个四

SVM -支持向量机原理详解与实践之三

SVM -支持向量机原理详解与实践之三 什么是核 什么是核,核其实就是一种特殊的函数,更确切的说是核技巧(Kernel trick),清楚的明白这一点很重要. 为什么说是核技巧呢?回顾到我们的对偶问题:     映射到特征空间后约束条件不变,则为:     在原始特征空间中主要是求,也就是和的内积(Inner Product),也称数量积(Scalar Product)或是点积(Dot Product),映射到特征空间后就变成了求,也就是和的映射到特征空间之后的内积,就如我前面所提到的在原始空间

SVM-支持向量机原理详解与实践之一

目录(?)[+] 前言 SVM机器学习与深度学习 人工智能领域 机器学习与深度学习 SVM简介 SVM原理分析 快速理解SVM原理 线性可分和线性不可分 函数间隔和几何间隔 超平面分析与几何间隔详解 二次最优化 SVM-支持向量机原理详解与实践 前言 去年由于工作项目的需要实际运用到了SVM和ANN算法,也就是支持向量机和人工神经网络算法,主要是实现项目中的实时采集图片(工业高速摄像头采集)的图像识别的这一部分功能,虽然几经波折,但是还好最终还算顺利完成了项目的任务,忙碌一年,趁着放假有时间好好

图像处理中的数学原理详解15——数列的极限

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 数学是图像处理技术的重要基础.在与图像处理有关的研究和实践中无疑需要用到大量的数学知识,这不免令许多基础薄

深度学习原理详解及Python代码实现

深度学习框架如Tensorflow和Pytorch等为用户提供了可供调用的API,但也隐藏了深度学习底层的实现细节. 为方便大家更加深入地理解深度学习原理并了解其底层实现方法,特此推出了<课程深度学习原理详解及Python代码实现>.期望能"掀起你的盖头来,让我看看你的模样",为深度学习进一步的优化和创新打下根基. 课程链接:https://edu.51cto.com/course/21426.html 本课程详细讲解深度学习原理并进行Python代码实现.课程内容涵盖感知

图像处理中的数学原理详解17——卷积定理及其证明

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 1.4.5   卷积定理及其证明 卷积定理是傅立叶变换满足的一个重要性质.卷积定理指出,函数卷积的傅立叶变

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

kickstart安装系统原理详解

前言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装. 常规的办法有什么? 光盘安装系统===>一个服务器DVD内置光驱百千块,百台服务器都配光驱就浪费了,因为一台服务器也就开始装系统能用的上,以后用的机会屈指可数.用USB外置光驱,插来插去也醉了. U盘安装系统===>还是同样的问题,要一台一台服务器插U盘. 网络安装系统(ftp,http,nfs) ===>这个方法不错,只要服务器能联网就可以装系统了

Storm概念、原理详解及其应用(一)BaseStorm

本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数"wordcount"代码不同的是,并不会有如何运行第一storm代码等内容,只有在运行完代码后,发现需要明白:"知其然,并知其所以然". Storm是什么?为什么要用Storm?为什么不用Spark? 第一个问题,以下概念足以解释: Storm是基于数据流的实时处理系统,提供了大吞吐量的实