使用libsvm对MNIST数据集进行实验

在学SVM中的实验环节,老师介绍了libsvm的使用。当时看完之后感觉简单的说不出话来。

1. libsvm介绍

虽然原理要求很高的数学知识等,但是libsvm中,完全就是一个工具包,拿来就能用。当时问了好几遍老师,公司里做svm就是这么简单的?敲几个命令行就可以了。。。貌似是这样的。当然,在大数据化的背景下,还会有比如:并行SVM、多核函数SVM等情况的研究和应用。

实验环节老师给的数据很简单,也就1000个数据点,使用svm进行分类。没有太多好说的。于是自己想要试试做手写字体分类检测,类似于行车违章拍照后的车牌识别。从网上搜到了数据集为MNIST数据集,是一个入门的基本数据集。

关于libsvm的介绍和使用参考:libSVM介绍。不过,svm-toy是最多支持三分类的,而不是只是二分类。

使用windows文件夹下的svm-train.exe,svm-predict.exe命令可以来进行建模和预测,具体参数看文档。

svm-train的主要可选参数有:

-s 选择SVM类型。一般选的是C-SVM

-c 选择松弛变量的权重系数。C越大,对松弛变量的惩罚越大,两个支持向量直线之间的间隔就越小,模型就越精确苛刻,对噪声数据点容忍小,越容易过拟合;C越小,两个支持向量直线之间的距离越大,对噪声的容忍能力就越大,最终效果越好。但是,模型分错的数据点就越多,容易欠拟合。

-t 选择核函数。一般是线性和RBF做对比,线性速度更快,但要求数据可分;RBF更通用,默认选择RBF。

-g garma系数。是exp(-gamma*|u-v|^2),相当于gamma=1/(2τ^2)。τ表示高斯函数中的宽度,g与τ成反比。g越大,τ越小,则高斯函数越窄,覆盖面积小,这样需要的支持向量越多,模型越复杂,容易过拟合。

-wi 对样本分类的权重分配。因为,在分类中,某些分类可能更加重要。

-v 交叉验证的参数。用来做交叉检验。

svm-predict只有一个可选参数,一般也不用。

2. 数据处理

从MNIST官网下载,解压,按照其中的数据格式对byte数据进行读取,提取到了train和test的图片灰度数据。图片均为28*28像素。其中,train数据为60000张,test数据10000张。
先使用svm测试了一下1000个数据,结果发现效果很差!只有11%左右的正确率。经过检查和实验,发现是没有对原始数据进行scale,可能导致数据差距过大,从而对结果产生影响。 
实验记录如下:
使用SVM在MNIST的十分类,在不对图像灰度数据进行scale的情况下,即:直接使用图像的像素值进行建模,最终得到只有11%左右的正确率,相当于十分之一。检查predict结果验证,发现predict都预测为1(这样差不多正好是十分之一的正确率)。因此,猜测数据若相差过大的情况下,不进行scale会严重影响SVM的性能。
阅读libsvm的文档后,将图像灰度数据scale到[0,1]之间,之后再使用小数据集测试得到80%+的正确率。
使用c=2,其他参数默认的情况下,对train_60k_scale.txt数据集进行建模,对test_10k_scale.txt测试数据集进行验证,得到95.02%的正确率。
使用./tools/grid.py方法(需修改内容参数,参看:libsvm 使用介绍),使用文档中的方法对1k的测试数据,对c和g都以(-10,10,1)为参数来寻找最优参数(实际上即是grid.py使用交叉验证法来寻找),最终得到最优参数为:c=4.0 g=0.015625 rate=91.1。按照该参数进行设定、使用train_60k_scale.txt数据集训练SVM模型,并对test_10k_scale.txt测试数据集进行验证,最终得到98.46%的正确率!
最终训练出来的SVM模型参数如下:
svm_type c_svc
kernel_type rbf
gamma 0.015625
nr_class 10
total_sv 12110
rho -0.409632 -0.529655 -0.842478 -0.567781 -0.125654 -0.34742 -0.696415 -0.191642 -1.4011 -0.0458988 -0.303381 0.0614391 0.420461 0.266255 -0.0264913 0.0878689 0.0784119 0.167691 0.0910791 0.577181 0.395401 0.0896789 0.381334 0.134266 -0.0137303 0.902749 0.779241 0.120543 0.203025 -0.523485 0.3886 0.468605 -0.14921 1.10158 -0.320523 -0.120132 -0.656063 -0.44432 -0.925911 -0.421136 -0.176363 -1.16086 0.0610109 0.0764374 -0.192982
label 5 0 4 1 9 2 3 6 7 8
nr_sv 1466 843 1229 516 1531 1419 1373 948 1101 1684
可以看出,在这60000个训练模型样本中,最终使用的支持向量有12110个。

3. 模型解释

对于支持向量模型中的参数解释,使用二分类的结果比较好解释,如下:
svm_type c_svc
kernel_type linear 使用线性分类器
nr_class 2 二分类
total_sv 15 支持向量个数
rho 0.307309
label 1 -1
nr_sv 8 7 正负类的支持向量(SV)个数
SV
1 1:7.213038 2:0.198066 
1 1:-4.405302 2:0.414567 
1 1:8.380911 2:0.210671 
1 1:3.491775 2:0.275496 
1 1:-0.926625 2:0.220477 
1 1:-2.220649 2:0.406389 
0.4752011717540238 1:1.408517 2:0.377613 
0.4510429211309505 1:-8.633542 2:0.546162 
-1 1:8.869004 2:-0.343454 
-1 1:7.263065 2:-0.239257 
-1 1:-4.2467 2:0.057275 
-0.9262440928849748 1:0.755912 2:-0.225401 
-1 1:-9.495737 2:-0.027652 
-1 1:9.100554 2:-0.297695 
-1 1:-3.93666 2:-0.047634 
支持向量分三种:对于正类数据:C(也就是参数-c:C设置的值)表示边界内的支持向量、0<x<C表示边界上的支持向量(即:在wx+b=±1和wx+b=0之间的支持向量)。对于负类数据也同理。支持向量机就主要是根据这两类支持向量来建立模型的。对于第三类数据,也就是错分数据,他们的位置是在支持向量的平面之外,也就是在另一类的区域,并且|wx+b|>1。这一类的点,在训练数据时并不存在,因此,不会出现在支持向量SV中。

使用libsvm对MNIST数据集进行实验的更多相关文章

  1. 使用libsvm对MNIST数据集进行实验---浅显易懂!

    原文:http://blog.csdn.net/arthur503/article/details/19974057 在学SVM中的实验环节,老师介绍了libsvm的使用.当时看完之后感觉简单的说不出 ...

  2. 使用KNN对MNIST数据集进行实验

    由于KNN的计算量太大,还没有使用KD-tree进行优化,所以对于60000训练集,10000测试集的数据计算比较慢.这里只是想测试观察一下KNN的效果而已,不调参. K选择之前看过貌似最好不要超过2 ...

  3. 使用Decision Tree对MNIST数据集进行实验

    使用的Decision Tree中,对MNIST中的灰度值进行了0/1处理,方便来进行分类和计算熵. 使用较少的测试数据测试了在对灰度值进行多分类的情况下,分类结果的正确率如何.实验结果如下. #Te ...

  4. Caffe初试(二)windows下的cafee训练和测试mnist数据集

    一.mnist数据集 mnist是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立,它有60000个训练样本集和10000个测试 ...

  5. 【Mxnet】----1、使用mxnet训练mnist数据集

    使用自己准备的mnist数据集,将0-9的bmp图像分别放到0-9文件夹下,然后用mxnet训练. 1.制作rec数据集 (1).制作list

  6. 从零到一:caffe-windows(CPU)配置与利用mnist数据集训练第一个caffemodel

    一.前言 本文会详细地阐述caffe-windows的配置教程.由于博主自己也只是个在校学生,目前也写不了太深入的东西,所以准备从最基础的开始一步步来.个人的计划是分成配置和运行官方教程,利用自己的数 ...

  7. mnist数据集转换bmp图片

    Mat格式mnist数据集下载地址:http://www.cs.nyu.edu/~roweis/data.html Matlab转换代码: load('mnist_all.mat'); type = ...

  8. caffe在windows编译project及执行mnist数据集測试

    caffe在windows上的配置和编译能够參考例如以下的博客: http://blog.csdn.net/joshua_1988/article/details/45036993 http://bl ...

  9. 使用caffe训练mnist数据集 - caffe教程实战(一)

    个人认为学习一个陌生的框架,最好从例子开始,所以我们也从一个例子开始. 学习本教程之前,你需要首先对卷积神经网络算法原理有些了解,而且安装好了caffe 卷积神经网络原理参考:http://cs231 ...

随机推荐

  1. iOS 推送,当接到推送消息时如何处理?

    接收到通知时有两种进入的方式:1.当app未运行时(BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...

  2. Flash学习初总结

    话说尝试了一周多的Flash编程,有些理解为什么很多程序员都不喜欢用Flash编程了. 首先,就是没有编程的难度,想要编好Flash,也就是有良好的视觉效果,那么关键点不在你的程序逻辑或者代码条理上, ...

  3. Dom4j 学习笔记

    dom4j 是一种解析 XML 文档的开放源代码 XML 框架.dom4j下载地址 本文主要记载了一些简单的使用方法. 一.xml文件的解析 dom4j既可以解析普通的xml文件,也可以解析一个Inp ...

  4. Mysql 数据库 操作语句

    mysql 格式语句规范 如何登陆你的数据库? 举例! 如果你的是 编译安装的花 那就得去编译安装后的那个目录中去,我的是安装到/usr/local/mysql 下登陆数据库:cd /usr/loca ...

  5. 转:maven报错非法字符:\65279 错误

    开发中一个项目很早就报这个错,maven报错非法字符:\65279 错误,今天终于忍无可忍要解决它 :编译java文件的时候,有些java文件报非法字符 \65279错误,在网上找和很多 方法,也试了 ...

  6. Leetcode Python Solution(continue update)

    leetcode python solution 1. two sum (easy) Given an array of integers, return indices of the two num ...

  7. spring mvc源码解析

    1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...

  8. 误删除了Oracle的dbf文件后的解决方法

    问题描述: 误删除Oracle数据库的dbf文件,在启动和关闭数据库是会提示错误. startup启动数据库时提示: ORA-01157:无法标识/锁定数据文件 ORA-01110:数据文件:‘... ...

  9. c#中的重写方法与隐藏方

    1.父类中有方法a,添加virtua修饰符可声明为虚方法,在子类中可以用override声明后重写方法a. 2.父类中有方法a,在子类中可以有new修饰符声明后隐藏父类方法. 子类重写方法后,对于子类 ...

  10. Redis单机版以及集群版的安装搭建以及使用

    1,redis单机版 1.1   安装redis n  版本说明 本教程使用redis3.0版本.3.0版本主要增加了redis集群功能. 安装的前提条件: 需要安装gcc:yum install g ...