C++实现SVM 算法

(一)数学推导

首先熟悉SVM的基础数学原理,可根据一下几篇博客的详细推导作为参考(强烈推荐):

SVM解释:一、SVM的整体框架

SVM解释:二、SVM的数学基础

SVM解释:三、线性可分的情况

SVM解释:四、线性不可分的情况

SVM解释:五、SMO算法

(二)实现流程

       捋一遍数学推导后准备着手实现,但发现数学推导的流程与程序实现的流程不尽相同,尤其是某些在数学上求和\sum \alpha _{i}y_{i}X_{i}^{T}X_{i}和核函数的值Ki,j频繁用到,实现时通常可进行缓存。接下来是一个用于实现的SVM三阶段、四大核心块的知识梳理。

C++实现SVM 算法_第1张图片

(三)实现方法

    1. tensorflow版本实现,未使用smo优化,而是用了tf的adam优化器,证明smo本身只是一种针对SVM的优化模型(支持向量的寻找过程决定了起关键作用的\alpha个数并不多)sgd或adam等优化算法理论上也可应用。参考:10行代码实现一个完整的SVM分类器

    2. python版本实现,相对简单,使用了smo优化算法,但在\alpha _{i}选择时使用了随机方法,未使用验证kkt条件的启发式搜索算法。同时其中采用了核函数却同时更新w,感觉有些奇怪。参考:Machine Learning 之 SVM实现

    3. python版本实现,但包含了kkt启发式搜索支持向量机(SVM)实现

    4. C++版本实现(也就是我的实现版本了),应用了c++的线性代数库armadillo(感兴趣的可以查看),实现了kkt启发式搜索的smo算法,同时针对kernel版本和线性可分两种情况分开处理,能够保证在线性可分数据集上的较高效率。代码地址:https://github.com/codestorm04/Arma_ML/blob/master/src/svm/svm.cc

svm.h

/*
* SVM classifier with kernel functions to handle non-linear divisable datasets.
* Mathmetics reference: 
        https://blog.csdn.net/guoziqing506/article/details/81126423
        https://blog.csdn.net/guoziqing506/article/details/81117820
        https://blog.csdn.net/guoziqing506/article/details/81119449
        https://blog.csdn.net/guoziqing506/article/details/81120354
        https://blog.csdn.net/guoziqing506/article/details/81155323
* compile with flags: g++ xxx.cc -std=c++14 -o test -larmadillo
* author: Yuzhen Liu
* Date: 2019.6.24 14:40
*/

#ifndef SVM_H
#define SVM_H

#include 
#include 
#include 
#include 
#include 

using namespace std;
using namespace arma;


// Implements a kernel-svm classifier
class SVM {

    public:
        SVM(double c=1.0, Kernel_Func* kn=NULL);
        ~SVM

你可能感兴趣的:(Machine,Learning,Theory,SVM,SMO,最优化,线性可分,Armadillo)