一、引言
手写数字识别是指给定一系列的手写数字图片以及对应的数字标签,构建模型进行学习,目标是对于一张新的手写数字图片能够自动识别出对应的数字。图像识别是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。机器学习领域一般将此类识别问题转化为分类问题。
由于数字类别只有0-9共10个,比其他字符识别率较高,可将其用于验证新的理论或做深入的分析研究。许多机器学习和模式识别领域的新理论和算法都是先用手写数字识别进行检验,验证其理论的有效性,然后才会将其应用到更为复杂的领域当中。在这方面的典型例子就是人工神经网络和支持向量机。
支持向量机support vector machines, SVM)本身便是一种监督式学习的方法。通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
二、数据及介绍及使用
2.1 Mnist数据集
MINIST是一个手写体数字的图片数据集。MNIST数据集一共有7万张图片,其中6万张是训练集,1万张是测试集[4]。每张图片是28*28的0-9的手写数字图片组成。每个图片是黑底白字的形式,黑底用0表示,白字用0-1之间的浮点数表示,越接近1,颜色越白。
训练集一共包含了60000张图像和标签,而测试集一共包含了10000张图像和标签。
表2-1 Minist数据集
|
文件下载 |
文件用途 |
|
train-images-idx3-ubyte.gz |
训练集图像 |
|
train-labels-idx1-ubyte.gz |
训练集标签 |
|
t10k-images-idx3-ubyte.gz |
测试集图像 |
|
t10k-labels-idx1-ubyte.gz |
测试集标签 |
2.2 PCA降维
PCA降维(Principal Component Analysis,PCA):主成分分析法,是最常用的线性降维方法。它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,即把原先的n个特征用数目更少的m个特征取代,新特征是旧特征的线性组合。并期望在所投影的维度上数据的方差最大,尽量使新的m个特征互不相关。从旧特征到新特征的映射捕获数据中的固有变异性。以此使用较少的数据维度,同时保留住较多的原数据点的特性。
PCA的思想是将n维特征映射到k维上(k<n),这k维是全新的正交特征。这k维特征称为主成分,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征
2.3 libSVM库和svmtrain分类器
Libsvm是基于支持向量机(support vector machine, SVM)实现的开源库,它主要用于分类(支持二分类和多分类)和回归。libsvm具有操作简单、易于使用、快速有效、且对SVM所涉及的参数调节相对较少的特点。
Svmtrain分类器包含许多参数,以下对参数做简单介绍:
-s svm类型:SVM设置类型(默认0)
0 -- C-SVC
1 --v-SVC
2 – 一类SVM
3 -- e -SVR
4 -- v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性:u'v
1 – 多项式:(r*u'v + coef0)^degree
2 – RBF函数:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-p p:设置e -SVR 中损失函数p的值(默认0.1)
三、实训内容及结果
3.1 实训内容
使用Matlab语言,将MINIST数据集中前3000个训练样本训练分类器,并使用前200个测试样本测试分类器的准确率,并记录分类器的训练时长。
实现PCA数据降维。以特征值由大到小累加,累加值与所有特征值总和之比超过90%为原则确定新特征向量维数。再使用与上部分相同的训练样本以及测试样本训练分类器,实现SVM分类,并记录分类器的训练时长。
3.2分类器设计
3.2.1 SVM实现分类
(1)数据处理
使用自己创建的LoadMNISTImages函数,读取训练样本集和测试样本集的图像,再使用使用自己创建的LoadMNISTLabel函数,读取训练样本集和测试样本集的标签。
从测试样本集中提取前200个样本用于测试分类器效果,从训练样本集中读取前3000个样本用于分类器的训练。
至此,构成训练分类器的训练样本和测试样本。
(2)使用svmtrain()函数进行SVM分类器训练
因为我们的实训目标是对0-9十个手写数字的识别,属于多分类问题。而传统SVM只能用于二分类问题,所以我们选择使用Libsvm库中的svmtrain函数来进行分类器的设计。
(3)寻找最优训练参数,并计算准确率及训练时长
通过调整svmtrain中参数的值,提高准确率,并使用tic-toc计算分类器分类时间。
3.2.2 SVM+PCA实现分类
(1)数据处理(同上)
(2)PCA降维,选适当维度达到自己需要的精度
使用传统PCA降维方法。先计算训练样本集的协方差矩阵,再计算协方差矩阵的特征向量组成的矩阵和对应的特征值,提取特征值大于等于1e-2到1之间的特征向量,根据主成分的个数选择降维后的维度。降维后的训练集data_train1 = pca' * data_train,即将降维后的矩阵转置,乘上训练样本。降维后的测试集data_test1= pca' * data_test,即将降维后的矩阵转置,乘上测试样本。
至此,PCA对训练集和测试集样本降维完成。
(3)使用svmtrain()函数进行SVM分类器训练(同上)
(4)寻找最优训练参数,并计算准确率及训练时长
在SVM+PCA实现分类时,准确率不但会受到svmtrain中参数的影响,还会受到降维后的维数影响。维数越大,会更好的保留样本的特征值,分类准确率也会越高,维数越低,样本特征值丢失的更多,分类准确率会降低。但是维数低,分类器分类时间会变短,因为需要测试的数据会变少。
同时用tic-toc计算分类器分类时间。
3.3分类器测试及结果分析
表1.1 两个分类器对比表
|
SVM |
PCA+SVM | |
|
测试样本数量 |
200 |
200 |
|
准确率 |
95% |
94% |
|
用时 |
1.715322 秒 |
0.204547 秒 |
在没有使用PCA降维之前,分类器预测准确率为95%,运行时间为1.715322 秒,分类效果较好。
PCA将原来的数据降到40维后,分类器预测准确率为94%,运行时间为0.201460秒;增加PCA降维的维数,再使用SVM分类训练,准确率提高,运行时间会变长;降低增加PCA降维的维数再使用SVM分类训练,准确率降低,运行时间会变短。
同时,cmd参数的取值对分类器的准确率、训练和预测时间也有影响,不合理的训练参数会使准确率降低,运行时间也会变长。
四、实训总结
在基于SVM手写数字识别中,我们先用自己创建的加载数据的函数将mnist数据集中的图片读取到MATLAB中,因为我们只需要训练集中的前3000个样本和测试集中的前200个样本,所以我们对数据进行了切分。
使用PCA降维时,需要先对训练集降维,再分别用降维后的矩阵乘以训练集和测试集得到降维后的训练集和降维后的测试集。所以我们没有使用MATLAB自带的pca函数,而是选择了
自己编写语句实现上述过程,至此,对训练集和测试集降维完成。
传统svm只能用于二分类,而我们的任务是识别十个数字,属于多分类问题,所以我们使用到了Libsvm安装包中的svmtrain函数,这个函数可以很好的解决基于SVM的多分类问题,不需要将问题转化成一对一或者一对多的过程,提高了效率。
观察训练结果,我们得出一下结论:
1.未使用pca降维时,使用svmtrain函数对我们使用训练样本设计的分类器有较好的训练效果,使用测试集前200个样本进行测试,准确率可以达到95%。
2.使用pca将原来的样本由784维降到40维后,维度变低,分类器的分类时间明显减少,但是准确率会变低到94%;再使用pca将原来的样本由784维降到97维后,分类器的分类时间有增加,但是准确率较上次会增加到96%,由此可见,pca降维会损失一部分原始样本的特征值,使分类准确率下降,但会提高运行效率,降低运行时间。如果增加pca降维的维度,样本损失的特征值变少,会提高分类器分类的准确率。
3.svmtrain函数中的参数也影响分类器的准确率,如果选取不合适的参数,准确率会变得很低,如开始时我们将-s参数设置为3,准确率变成了0,这是因为-s参数为3时,svm是回归分析,不适用于我们的实验,所以更改-s参数为0,准确率提高到了95%。
在本次实训中,我理解了MATLAB里的很多函数,也更多地了解了MATLAB使用方法。通过不断地在网上查资料,自己对代码的理解能力也提高了不少,对以后的学习也更有帮助。

4万+

被折叠的 条评论
为什么被折叠?



