当前位置: 首页 > news >正文

【Python机器学习】支持向量机——手写数字识别问题

基于SVM的数字识别步骤:

1、收集数据:提供的文本文件

2、准备数据:基于二值图像构造向量

3、分析数据:对图像向量进行目测

4、训练算法:采用两种不同的核函数,并对径向基核函数采用不同的设置来运行SMO算法

5、测试算法:编写一个函数来测试不同的核函数并计算错误率

6、使用算法:一个图像识别的完整应用还需要一些图像处理的知识。

构建一个系统去测试手写数字上的分类器:

def img2vector(filename):returnVect=zeros((1,1024))fr=open(filename)for i in range(32):lineStr=fr.readline()for j in range(32):returnVect[0,32*i+j]=int(lineStr[j])return returnVectdef loadImages(dirName):from os import listdirhwLabels=[]trainingFileList=listdir(dirName)m=len(trainingFileList)trainingMat=zeros((m,1024))for i in range(m):fileNameStr=trainingFileList[i]fileStr=fileNameStr.split('.')[0]classNumStr=int(fileStr.split('_')[0])if classNumStr==9:hwLabels.append(-1)else:hwLabels.append(1)trainingMat[i,:]=img2vector('%s/%s'%(dirName,fileNameStr))return trainingMat,hwLabelsdef testDigits(kTup=('rbf',10)):dataArr,labelArr=loadImages('trainingDigits')b,alphas=svm_11.smoP(dataArr,labelArr,200,0.0001,10000,kTup)dataMat=mat(dataArr)labelMat=mat(labelArr).transpose()svInd=nonzero(alphas.A>0)[0]sVs=dataMat[svInd]labelSV=labelMat[svInd]print('there are %d Support Vectors' % shape(sVs)[0])m,n=shape(dataMat)errorCount=0for i in range(m):kernelEval=svm_11.kernelTrans(sVs,dataMat[i,:],kTup)predict=kernelEval.T*multiply(labelSV,alphas[svInd])+bif sign(predict)!=sign(labelArr[i]):errorCount=errorCount+1print('训练集错误率:',(float(errorCount)/m))dataArr,labelArr=loadImages()errorCount = 0dataMat=mat(dataArr)labelMat=mat(labelArr).transpose('testDigits')m,n=shape(dataMat)for i in range(m):kernelEval = svm_11.kernelTrans(sVs, dataMat[i, :], kTup)predict = kernelEval.T * multiply(labelSV, alphas[svInd]) + bif sign(predict) != sign(labelArr[i]):errorCount = errorCount + 1print('测试集错误率:', (float(errorCount) / m))testDigits()

函数loadImages()是作为k近邻算法中的一部分出现的。它已经被重构为自身的一个函数。其中最大的区别在于,支持向量机中类别标签为-1和+1,,因此,一旦碰到数字9,则输出类别标签-1,否则输出+1,。本质上,支持向量机是一个二类分类器,其分类结果不是+1就是-1。

testDigits()和testRbf()几乎一样,区别在于它调用了loadImages()函数来获得类别标签和数据。kTup是输入参数。

上述代码运行结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
  • 反激式电源为什么上电最容易烧MOS管?
  • python dash框架
  • 【linux深入剖析】初识线程---线程概念
  • JavaEE-多线程编程阻塞队列
  • 探索之路——初识 Vue Router:构建单页面应用的完整指南
  • 网络空间安全专业怎么样,可通过哪些途径自学?
  • 【Redis】 Redis 列表指令指南
  • python open cv(图像处理的基本操作)
  • Spring Bean生命周期
  • 什么是单例模式?
  • 【两整数之和】python刷题记录
  • Go并发编程
  • 简单的位运算
  • 设计模式实战:社交网络平台的设计与实现
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • docker python 配置
  • JavaScript 基础知识 - 入门篇(一)
  • Logstash 参考指南(目录)
  • markdown编辑器简评
  • MD5加密原理解析及OC版原理实现
  • SpriteKit 技巧之添加背景图片
  • supervisor 永不挂掉的进程 安装以及使用
  • vue 个人积累(使用工具,组件)
  • vue总结
  • windows-nginx-https-本地配置
  • 多线程 start 和 run 方法到底有什么区别?
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 数组的操作
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #### golang中【堆】的使用及底层 ####
  • #Java第九次作业--输入输出流和文件操作
  • #NOIP 2014# day.1 T2 联合权值
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (ZT)出版业改革:该死的死,该生的生
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (十)Flink Table API 和 SQL 基本概念
  • (四) 虚拟摄像头vivi体验
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .JPG图片,各种压缩率下的文件尺寸
  • .net core 3.0 linux,.NET Core 3.0 的新增功能