标签: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的一个数字;
如这幅图显示的为数字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;
标签:blog http os ar 使用 for sp 文件 数据
原文地址:http://www.cnblogs.com/yuzhuwei/p/4051221.html