基于支持向量机的Digits手写数字识别

描述

支持向量机(Support Vector Machine,简称SVM)模型既可以用于分类也可以用于回归。手写数字识别是一个多分类问题(判断一张手写数字图片是0~9中的哪一个),数据集采用Sklearn自带的Digits数据集,包括1797个手写数字样本,样本为8*8的像素图片,每个样本表示1个手写数字。我们的任务是基于支持向量机算法构建模型,使其能够识别测试集中的手写数字。

本任务的主要实践内容:

  1. Digits手写数字数据集的加载与可视化

  2. SVM分类模型的创建

  3. 模型参数调优、评估及手写数字识别预测

源码下载

环境

  • 操作系统:Windows10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库

    matplotlib   3.3.4
    numpy           1.19.5
    pandas          1.1.5
    scikit-learn    0.24.2
    mglearn        0.1.9
    

分析

Digits数据集中样本数据data的形状为(1797,64),每一行是一个图片的像素数组(长度为64)。样本对应的标签(即每张图片对应的实际数字)存储在target数组中,其长度为1797,因为训练数据是有标签的,因此本实验是监督学习中的一个分类问题。

本任务涉及以下几个环节:

a)加载、查看Digits数据集

b)数据集拆分

d)构建模型拟合数据、评估并做出预测

e)使用其他分类模型做对比

步骤

步骤一、加载、查看Digits数据集

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import matplotlib.pyplot as plt# 加载Digits数据集
digits = load_digits()
data = digits.data # 样本数据
target = digits.target # 标签数据
print(data.shape, target.shape) # 输出数组形状# 使用Matplotlib,显示前20张图片
fig = plt.figure(figsize=(8, 8), facecolor='w')
for i in range(20):ax = fig.add_subplot(4, 5, i+1) # matshow方法将像素矩阵显示为图片# data中的图片像素为长度64的一维数组,需要转成8*8的二维数组来显示ax.matshow(data[i].reshape(8, 8))plt.show()

显示结果:

步骤二、数据集拆分、创建模型并预测

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.25, random_state=0)
print(X_train.shape, X_test.shape)# 创建模型,拟合训练数据
# model = SVC().fit(X_train, y_train) # 默认参数准确率不高
model = SVC(gamma='scale').fit(X_train, y_train) # 指定参数# 评估模型
score = model.score(X_test, y_test)
print('score: ', score)# 预测结果并与实际结果对比(预测测试集前20张图片)
y_pred = model.predict(X_test[:20])
print('预测数字:', y_pred)
print('实际数字:', y_test[:20])

输出结果:

(1347, 64) (450, 64)
score:  0.9911111111111112
预测数字: [2 8 2 6 6 7 1 9 8 5 2 8 6 6 6 6 1 0 5 8]
实际数字: [2 8 2 6 6 7 1 9 8 5 2 8 6 6 6 6 1 0 5 8]

步骤三、使用其他分类模型实现

from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.neighbors import KNeighborsClassifier# 定义多个分类模型,加入字典中
models = {}
models['逻辑回归'] = LogisticRegression() # 逻辑回归
models['决策树'] = DecisionTreeClassifier() # 决策树
models['随机森林'] = RandomForestClassifier(100) # 集成算法-随机森林
models['K-最近邻'] = KNeighborsClassifier(n_neighbors=3) # K-最近邻
models['支持向量机'] = SVC(gamma='scale') # 支持向量机# 循环拟合数据,评估模型成绩
for key, value in models.items():model = value.fit(X_train, y_train)score = model.score(X_test, y_test)print('{} :{:0.2f}'.format(key, score))

输出结果:

逻辑回归 :0.95
决策树 :0.82
随机森林 :0.98
K-最近邻 :0.99
支持向量机 :0.99

基于支持向量机的Digits手写数字识别相关推荐

  1. Python,OpenCV基于支持向量机SVM的手写数字OCR

    Python,OpenCV基于支持向量机SVM的手写数字OCR 1. 效果图 2. SVM及原理 2. 源码 2.1 SVM的手写数字OCR 2.2 非线性SVM 参考 上一节介绍了基于KNN的手写数 ...

  2. 基于SVM技术的手写数字识别

    老师常说,在人工智能未发展起来之前,SVM技术是一统江湖的,SVM常常听到,但究竟是什么呢?最近研究了一下基于SVM技术的手写数字识别.你没有看错,又是手写数字识别,就是喜欢这个手写数字识别,没办法( ...

  3. 基于深度学习的手写数字识别算法Python实现

    摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...

  4. 基于深度学习的手写数字识别、python实现

    基于深度学习的手写数字识别.python实现 一.what is 深度学习 二.加深层可以减少网络的参数数量 三.深度学习的手写数字识别 一.what is 深度学习 深度学习是加深了层的深度神经网络 ...

  5. 基于K210的MNIST手写数字识别

    基于K210的MNIST手写数字识别 项目已开源链接: Github. 硬件平台 采用Maixduino开发板 在sipeed官方有售 软件平台 使用MaixPy环境进行单片机的编程 官方资源可在这里 ...

  6. 基于深度学习的手写数字识别Matlab实现

    基于深度学习的手写数字识别Matlab实现 1.网络设计 2. 训练方法 3.实验结果 4.实验结果分析 5.结论 1.网络设计 1.1 CNN(特征提取网络+分类网络) 随着深度学习的迅猛发展,其应 ...

  7. MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试

    文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...

  8. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

  9. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

最新文章

  1. Linux 01 Liunx目录结构及文件基本操作
  2. 【并发编程】Atomic与CAS
  3. 第一款鸿蒙摄像头,随时随地看一看!华为首款鸿蒙智能摄像头发布
  4. Makefile的重建与include指令
  5. 计算输入序列能组成三角形的个数
  6. 循环所有数据库执行脚本
  7. 山寨十年,东鹏特饮终于打败红牛!但却很尴尬
  8. PAT (Basic Level) Practice (中文)答案合集
  9. 跳频通信(梅文华)pdf
  10. Windows命令提示符中的别名
  11. utilities(matlab)—— 图像加噪
  12. 可靠性工程基础 修订版 课后答案 (刘品)
  13. 模拟电子技术基础笔记(2)——半导体基础知识
  14. 寻找肇事汽车车牌号C语言,北京交通大学C语言综合程序的设计(黄宇班).doc
  15. C++无法打开库文件/无法打开源文件
  16. 在switch时使用枚举类型
  17. php revel,Revel框架安装
  18. 解决Win10自动打开代理问题
  19. 也谈阻塞、非阻塞、同步、异步
  20. 直播延时是如何产生的?4G摄像头无插件播放视频流媒体服务器EasyDSS超低延时直播的实现方案

热门文章

  1. Mysql + Mybatis批量更新报错 BadSqlGrammarException
  2. 对未来计算机的畅想英语作文,你认为未来生活是什么样子的英语作文90词左右...
  3. Docker学习:外部浏览器访问容器 | 容器访问容器 | 访问容器的常用5种方式 | -p -P 详解
  4. LTE中小区选择流程及其S准则详解
  5. 查询部门人数大于2人的部门编号
  6. GBase 8c原位更新技术
  7. MySQL UPDATE语句
  8. spring boot中配置虚拟路径,用来映射显示图片
  9. Centos7 安装ELK/EFK 7.x 集群搭建实战攻略
  10. 有个学计算机的男朋友出轨,“男友发了一条朋友圈,我才知道他出轨了”