今天看了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;
时间: 2024-10-13 20:28:11