首页 > 代码库 > 基于SMO—RBF的SVM手写体识别分类之Python

基于SMO—RBF的SVM手写体识别分类之Python

今天看了Python语言写的使用SVM中的SMO进行优化,使用RBF函数进行手写体识别,下面简单整理一下整个过程及思路,然后详细介绍各个部分。

(1)获取训练数据集trainingMat和labelMat;

(2)利用SMO进行优化获得优化参数alphas和b,这一步即是进行训练获得最优参数

(3)使用alphas和b带入RBF高斯核函数计算训练集输出并计算训练错误率;

(4)获取测试数据集testMat和labelMat1;

(5)使用(2)的参数alphas和b带入RBF高斯核函数计算输出,从而计算分类错误率。

def testDigits(kTup=(‘rbf‘,10)):    dataArr,labelArr=loadImages(‘D://softwareTool/Python/python_exerciseCode/Chap6_SVM//trainingDigits‘);    b,alphas=smoP(dataArr,labelArr,200,0.0001,1000,kTup);                    dataMat=mat(dataArr);    labelMat=mat(labelArr).transpose();    # 取得支持向量的索引    svInd=nonzero(alphas.A>0)[0];    sVs=dataMat[svInd];    labelSV=labelMat[svInd];    print("there are ",shape(sVs)[0],‘ Support Vectors‘);    m,n=shape(dataMat);    errorCount=0.0;    for i in range(m):        kernelEvl=kernelTrans(sVs,dataMat[i,:],kTup);        # 计算输出公式        predict=kernelEvl.T*multiply(labelSV,alphas[svInd])+b;        if sign(predict)!=sign(labelMat[i]):            errorCount+=1.0;    print("the training error rate is:",errorCount/(len));    dataArr,labelArr=loadImages(‘D://softwareTool/Python/python_exerciseCode/Chap6_SVM//testDigits‘);    dataMat=mat(dataArr);    labelMat=mat(labelArr).transpose();    m,n=shape(dataMat);    errorCount=0.0;    for i in range(m):        kernelEval=kernelTrans(sVs,dataMat[i,:],kTup);        predict=kernelEval*multiply(labelSV,alphas[svInd])+b;        if sign(predict)!=sign(labelMat[i]):            errorCount+=1.0;    print("the test error rate is: ",errorCount/float(ms));

  上面是整个主框架和主程序。

下面分模块介绍各个部分:

(1)获取训练数据集和训练标签:

如给的训练数据存放在文件trainingDigits中,其里面有多个.txt子文件,每个.txt文件存放的是一幅32*32的的图像,每一幅图像表示0-9的一个数字;

 

 

 如这幅图显示的为数字3,最后将每幅图像转化为一个32*32=1024的列向量,如果训练样本数为m,则dataMat为m*1024的矩阵,labelMat为1*m的列向量。

下面先说说在Python中怎样将一幅图像(例32*32)转化为一个列向量(1*1024):函数输入为这幅图像的文件名‘3_177.txt’

伪代码:初始化列向量returnVec为zeors((1,1024));

          遍历每行:

               读取每行(1*32的列向量)内容;

               将每行内容添加到returnVec中;

         返回returnVec;

基于SMO—RBF的SVM手写体识别分类之Python