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

原文:http://blog.csdn.net/arthur503/article/details/19974057

在学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中。

时间: 2024-10-21 08:11:48

使用libsvm对MNIST数据集进行实验---浅显易懂!的相关文章

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

使用的Decision Tree中,对MNIST中的灰度值进行了0/1处理,方便来进行分类和计算熵. 使用较少的测试数据测试了在对灰度值进行多分类的情况下,分类结果的正确率如何.实验结果如下. #Test change pixel data into more categories than 0/1:#int(pixel)/50: 37%#int(pixel)/64: 45.9%#int(pixel)/96: 52.3%#int(pixel)/128: 62.48%#int(pixel)/152

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

一.前言 本文会详细地阐述caffe-windows的配置教程.由于博主自己也只是个在校学生,目前也写不了太深入的东西,所以准备从最基础的开始一步步来.个人的计划是分成配置和运行官方教程,利用自己的数据集进行训练和利用caffe来实现别人论文中的模型(目前在尝试的是轻量级的SqueezeNet)三步走.不求深度,但求详细.因为说实话caffe-windows的配置当初花了挺多时间的,目前貌似还真没有从头开始一步步讲起的教程,所以博主就争取试着每一步都讲清楚吧. 这里说些题外话:之所以选择Sque

Tensorflow MNIST 数据集測试代码入门

本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50614444 測试代码已上传至GitHub:yhlleo/mnist 将MNIST数据集,下载后复制到目录Mnist_data中,假设已经配置好tensorflow环境,基本的四个測试代码文件,都能够直接编译执行: mnist_softmax.py: MNIST机器学习入门 mnist_deep.py: 深入MNIST fully_co

mnist的格式说明,以及在python3.x和python 2.x读取mnist数据集的不同

#!/usr/bin/env python # -*- coding: UTF-8 -*- import struct # from bp import * from datetime import datetime # 数据加载器基类 class Loader(object): def __init__(self, path, count): ''' 初始化加载器 path: 数据文件路径 count: 文件中的样本个数 ''' self.path = path self.count = co

Ubuntu14.04+caffe+cuda7.5 环境搭建以及MNIST数据集的训练与测试

Ubuntu14.04+caffe+cuda 环境搭建以及MNIST数据集的训练与测试 一.ubuntu14.04的安装: ubuntu的安装是一件十分简单的事情,这里给出一个参考教程: http://jingyan.baidu.com/article/76a7e409bea83efc3b6e1507.html 二.cuda的安装: 1.首先下载nvidia cuda的仓库安装包(我的是ubuntu 14.04 64位,所以下载的是ubuntu14.04的安装包,如果你是32位的可以参看具体的地

windows下的cafee训练和测试mnist数据集

一.mnist数据集 mnist是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立,它有60000个训练样本集和10000个测试样本集.mnist数据库官方网址为:http://yann.lecun.com/exdb/mnist/ .可直接下载四个解压文件,分别对应:训练集样本.训练集标签.测试集样本和测试集标签.解压缩之后发现,其是在一个文件中包含了所有图像. 二.caffe支持的数据格式:Lmdb和Leveldb 它们都

MFC基于对话框 手写数字识别 SVM+MNIST数据集

完整项目下载地址: http://download.csdn.net/detail/hi_dahaihai/9892004 本项目即拿MFC做了一个画板,画一个数字后可自行识别数字.此外还 有保存图片.清空画板功能,简单实用. 识别方法为SVM调用已经训练好的MNIST数据集"SVM_DATA.xml" MNIST数据集训练方法自行百度,一大堆. 本项目基于OpenCv 2.4.6,下载的朋友自行修改配置为自己使用的OpenCv版本即可.

将普通的图像数据制作成类似于MNIST数据集的.gz文件(数据集制作)

做完MNIST数据集的训练之后,我们想把自己的数据也拿来做一下相关的训练,那么如果调用MNIST数据读取的接口就需要按照他的数据格式来存取数据,首先来看看这个接口(input_data.read_data_set())): #coding=utf-8 #input_data.py的详解 #学习读取数据文件的方法,以便读取自己需要的数据库文件(二进制文件) """Functions for downloading and reading MNIST data."&qu

利用keras搭建CNN进行mnist数据集分类

当接触深度学习算法的时候,大家都很想自己亲自实践一下这个算法,但是一想到那些复杂的程序,又感觉心里面很累啊,又要学诸如tensorflow.theano这些框架.那么,有没有什么好东西能够帮助我们快速搭建这个算法呢?当然是有咯!,现如今真不缺少造轮子的大神,so,我强烈向大家推荐keras,Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow或Theano.Keras为支持快速实验而生,能够把你的idea迅速转换为结果. 具体keras的安装与使用,请参