码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-10-26 00:22:49      阅读:966      评论:0      收藏:0      [点我收藏+]

标签:blog   http   os   ar   使用   for   sp   文件   数据   

今天看了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的一个数字;

 

 

 bubuko.com,布布扣如这幅图显示的为数字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

标签:blog   http   os   ar   使用   for   sp   文件   数据   

原文地址:http://www.cnblogs.com/yuzhuwei/p/4051221.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!