SVM 支持向量机简介+SVM15种场景分类实例

文章目录
支持向量机简介
支持向量机(SVM)是和 提出的 , 是基于优美的数学理论的一种机器学习算法 。SVM是针对线性可分情景的广义线性回归模型 , 对于线性不可分的情况 , 则通过“核技巧”将低维特征空间的线性不可分样本映射到高维空间中 , 实现对非线性样本进行线性分析 。SVM在小样本的情况下表现也不错 , 但是其计算代价较高 , 计算速度慢 , 且性能逐渐被新晋的树类集成算法和深度算法所领先 。SVM目前在小样本、非线性、高维的应用场景中仍有一席之地 , 且其数学理论完备 , 非常值得学习 。
SVM是一个二分类的分类模型 , 即寻找一个超平面将样本分为两类 , 若是多分类问题 , 则通过one vs rest构建多个二分类SVM形成多分类SVM 。支持向量机用作回归(SVR)时 , 即学习得一个超平面函数f(x) , 使得f(x)尽量与标签y接近 , 而与传统回归模型不同的是 , 当f(x)与y的差值大于设定阈值时才开始计算损失 。
SVM的重点在于超平面分割、核技巧映射、凸二次规划问题求解等等 , 推荐这位大佬的理论推导 , 非常详细 。本人数学知识也是比较有限 , 就不在理论上班门弄斧了 。
SVM15种场景分类实例
参考李飞飞在2005年发表的论文《AModel forScene 》中的bag of words思想 , 先通过对每张图进行SIFT+聚类+直方图统计构建场景特征的特征库(词库) , 即每种场景都可由特征库中的特征表示 , 然后利用SVM对场景进行分类 。
这是要用到的15类场景数据库:
主要流程如下:
数据预处理:
1、 读取15个类别共8970张图片建立总数据集
2、分层随机抽样划分训练集与测试集
Bag Of Word词库建立:
1、 对训练集与测试集中每张图进行SIFT特征提取 , 出于减少计算量的考虑 , 只计算通过固定步长进行网格采样获得的点的SIFT特征 。
2、指定聚类中心即总单词个数后对训练集中的所有SIFT特征向量进行K-Means聚类
3、对训练集与测试集中每张图对应的SIFT特征向量分别进行直方图统计 , 对应生成直方图统计数据的训练集与测试集
SVM模型构建:
1、调用库中的SVM模型 , 在默认参数下换用不同的核函数进行训练 , 并计算其在测试集上的表现 。

SVM  支持向量机简介+SVM15种场景分类实例

文章插图
2、对上一步的模型在训练集上进行5折交叉验证的网格调参以提高模型的性能 , 并计算调参后的模型在测试集上的表现
库SVM中常用的核函数有三种:
=''用于线性可分情形 , 参数少 , 速度快
='rbf'主要用于线性不可分情形 , 参数多 , 需要调参
='poly'多项式核函数 , 可用于非线性分类
各SVM的主要调参对象是惩罚系数c , c越小 , 则允许更多错分样本 。
接下来就上代码啦:
import cv2import numpy as npimport matplotlib.pyplot as pltimport sklearnfrom sklearn.model_selection import train_test_splitfrom sklearn.cluster import KMeansfrom sklearn import preprocessingfrom sklearn.svm import LinearSVCimport copyfrom sklearn.metrics import roc_auc_score,roc_curve,auc,accuracy_score,classification_report,confusion_matrix,f1_scoreimport itertoolsfrom sklearn.metrics import confusion_matriximport pandas as pdfrom sklearn.svm import SVCimport globfrom sklearn.model_selection import cross_val_scorefrom sklearn import metricsfrom sklearn.model_selection import GridSearchCV