用支持向量机进行光学符号识别

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972

   个人介绍: 研一|统计学|干货分享
         擅长Python、Matlab、R等主流编程软件
         累计十余项国家级比赛奖项,参与研究经费10w、40w级横向

文章目录

  • 1 目的
  • 2 数据来源
  • 3 案例演示
    • 3.1 探索数据
    • 3.2 模型的建立及优化
      • 3.2.1 创建训练集和测试集
      • 3.2.2 基于数据训练模型
      • 3.2.3 评估模型性能
      • 3.2.4 提高模型的性能

1 目的

  我们的研究目标是利用支持向量机(SVM)这一强大的机器学习算法,通过对图像字符的各种特征属性进行深入分析,实现对不同字母的精确区分。在这个过程中,我们将重点关注图像字符的水平尺寸和垂直尺寸,因为这些尺寸信息对于区分不同字母至关重要。

2 数据来源

    该演示数据来源于: [机器学习和智能系统中心](http://archive.ics.uci.edu/ml)

3 案例演示

3.1 探索数据

  运行代码:

data<-read.csv("G:\\letterdata.csv")                 #数据读取
str(data)

  结果展示:

## 'data.frame':    20000 obs. of  17 variables:
##  $ letter: Factor w/ 26 levels "A","B","C","D",..: 20 9 4 14 7 19 2 1 10 13 ...
##  $ xbox  : int  2 5 4 7 2 4 4 1 2 11 ...
##  $ ybox  : int  8 12 11 11 1 11 2 1 2 15 ...
##  $ width : int  3 3 6 6 3 5 5 3 4 13 ...
##  $ height: int  5 7 8 6 1 8 4 2 4 9 ...
##  $ onpix : int  1 2 6 3 1 3 4 1 2 7 ...
##  $ xbar  : int  8 10 10 5 8 8 8 8 10 13 ...
##  $ ybar  : int  13 5 6 9 6 8 7 2 6 2 ...
##  $ x2bar : int  0 5 2 4 6 6 6 2 2 6 ...
##  $ y2bar : int  6 4 6 6 6 9 6 2 6 2 ...
##  $ xybar : int  6 13 10 4 6 5 7 8 12 12 ...
##  $ x2ybar: int  10 3 3 4 5 6 6 2 4 1 ...
##  $ xy2bar: int  8 9 7 10 9 6 6 8 8 9 ...
##  $ xedge : int  0 2 3 6 1 0 2 1 1 8 ...
##  $ xedgey: int  8 8 7 10 7 8 8 6 6 1 ...
##  $ yedge : int  0 4 3 2 5 9 7 2 1 1 ...
##  $ yedgex: int  8 10 9 8 10 7 10 7 7 8 ...

  通过程序结果可以看出,样本数据的评判特征属性均为数值型,所属类别为因子型。由于每个特征在支持向量机中都需要缩小到一个相当小的区间。故在这种情况下,每个特征都是一个整数,所以不需要将任意一个因子转化为数字。并且用来拟合支持向量机模型的R添加包含有自动对数据进行重新调整的功能,可以跳过标准化数据操作。

3.2 模型的建立及优化

3.2.1 创建训练集和测试集

  运行代码:

data_train<-data[1:16000,]     #训练集
data_test<-data[16001:20000,]  #测试集

  通过程序结果可以看出,样本数据的评判特征属性均为数值型,所属类别为因子型。由于每个特征在支持向量机中都需要缩小到一个相当小的区间。故在这种情况下,每个特征都是一个整数,所以不需要将任意一个因子转化为数字。并且用来拟合支持向量机模型的R添加包含有自动对数据进行重新调整的功能,可以跳过标准化数据操作。

3.2.2 基于数据训练模型

  运行代码:

library("kernlab")             #加载包
data_classifier<-ksvm(letter~.,data=data_train,kernel="vanilladot")
data_classifier

  结果展示:

## Support Vector Machine object of class "ksvm" 
## 
## SV type: C-svc  (classification) 
##  parameter : cost C = 1 
## 
## Linear (vanilla) kernel function. 
## 
## Number of Support Vectors : 7037 
## 
## Objective Function Value : -14.1746 -20.0072 -23.5628 -6.2009 -7.5524 -32.7694 -49.9786 -18.1824 -62.1111 -32.7284 -16.2209 -32.2837 -28.9777 -51.2195 -13.276 -35.6217 -30.8612 -16.5256 -14.6811 -32.7475 -30.3219 -7.7956 -11.8138 -32.3463 -13.1262 -9.2692 -153.1654 -52.9678 -76.7744 -119.2067 -165.4437 -54.6237 -41.9809 -67.2688 -25.1959 -27.6371 -26.4102 -35.5583 -41.2597 -122.164 -187.9178 -222.0856 -21.4765 -10.3752 -56.3684 -12.2277 -49.4899 -9.3372 -19.2092 -11.1776 -100.2186 -29.1397 -238.0516 -77.1985 -8.3339 -4.5308 -139.8534 -80.8854 -20.3642 -13.0245 -82.5151 -14.5032 -26.7509 -18.5713 -23.9511 -27.3034 -53.2731 -11.4773 -5.12 -13.9504 -4.4982 -3.5755 -8.4914 -40.9716 -49.8182 -190.0269 -43.8594 -44.8667 -45.2596 -13.5561 -17.7664 -87.4105 -107.1056 -37.0245 -30.7133 -112.3218 -32.9619 -27.2971 -35.5836 -17.8586 -5.1391 -43.4094 -7.7843 -16.6785 -58.5103 -159.9936 -49.0782 -37.8426 -32.8002 -74.5249 -133.3423 -11.1638 -5.3575 -12.438 -30.9907 -141.6924 -54.2953 -179.0114 -99.8896 -10.288 -15.1553 -3.7815 -67.6123 -7.696 -88.9304 -47.6448 -94.3718 -70.2733 -71.5057 -21.7854 -12.7657 -7.4383 -23.502 -13.1055 -239.9708 -30.4193 -25.2113 -136.2795 -140.9565 -9.8122 -34.4584 -6.3039 -60.8421 -66.5793 -27.2816 -214.3225 -34.7796 -16.7631 -135.7821 -160.6279 -45.2949 -25.1023 -144.9059 -82.2352 -327.7154 -142.0613 -158.8821 -32.2181 -32.8887 -52.9641 -25.4937 -47.9936 -6.8991 -9.7293 -36.436 -70.3907 -187.7611 -46.9371 -89.8103 -143.4213 -624.3645 -119.2204 -145.4435 -327.7748 -33.3255 -64.0607 -145.4831 -116.5903 -36.2977 -66.3762 -44.8248 -7.5088 -217.9246 -12.9699 -30.504 -2.0369 -6.126 -14.4448 -21.6337 -57.3084 -20.6915 -184.3625 -20.1052 -4.1484 -4.5344 -0.828 -121.4411 -7.9486 -58.5604 -21.4878 -13.5476 -5.646 -15.629 -28.9576 -20.5959 -76.7111 -27.0119 -94.7101 -15.1713 -10.0222 -7.6394 -1.5784 -87.6952 -6.2239 -99.3711 -101.0906 -45.6639 -24.0725 -61.7702 -24.1583 -52.2368 -234.3264 -39.9749 -48.8556 -34.1464 -20.9664 -11.4525 -123.0277 -6.4903 -5.1865 -8.8016 -9.4618 -21.7742 -24.2361 -123.3984 -31.4404 -88.3901 -30.0924 -13.8198 -9.2701 -3.0823 -87.9624 -6.3845 -13.968 -65.0702 -105.523 -13.7403 -13.7625 -50.4223 -2.933 -8.4289 -80.3381 -36.4147 -112.7485 -4.1711 -7.8989 -1.2676 -90.8037 -21.4919 -7.2235 -47.9557 -3.383 -20.433 -64.6138 -45.5781 -56.1309 -6.1345 -18.6307 -2.374 -72.2553 -111.1885 -106.7664 -23.1323 -19.3765 -54.9819 -34.2953 -64.4756 -20.4115 -6.689 -4.378 -59.141 -34.2468 -58.1509 -33.8665 -10.6902 -53.1387 -13.7478 -20.1987 -55.0923 -3.8058 -60.0382 -235.4841 -12.6837 -11.7407 -17.3058 -9.7167 -65.8498 -17.1051 -42.8131 -53.1054 -25.0437 -15.302 -44.0749 -16.9582 -62.9773 -5.204 -5.2963 -86.1704 -3.7209 -6.3445 -1.1264 -122.5771 -23.9041 -355.0145 -31.1013 -32.619 -4.9664 -84.1048 -134.5957 -72.8371 -23.9002 -35.3077 -11.7119 -22.2889 -1.8598 -59.2174 -8.8994 -150.742 -1.8533 -1.9711 -9.9676 -0.5207 -26.9229 -30.429 -5.6289 
## Training error : 0.130062

  利用Kernlab包拟合支持向量机模型,并初步指定线性核函数进行拟合。经过测试结果发现,模型信息对关于模型在真实世界的运行好坏程度并未充分告知,接下来对测试集进行拟合,根据模型判别准确度评估模型性能。

3.2.3 评估模型性能

1.模型结果明细

  运行代码:

data_predictions<-predict(data_classifier,data_test) #预测
head(data_predictions)                               #测试集前六行预测结果
table(data_predictions,data_test$letter)

  结果展示:

> head(data_predictions)                               #测试集前六行预测结果 
## [1] U N V X N H
## Levels: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
> head(data_predictions)                               #测试集前六行预测结果 
##                 
## data_predictions   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
##                A 144   0   0   0   0   0   0   0   0   1   0   0   1   2   2
##                B   0 121   0   5   2   0   1   2   0   0   1   0   1   0   0
##                C   0   0 120   0   4   0  10   2   2   0   1   3   0   0   2
##                D   2   2   0 156   0   1   3  10   4   3   4   3   0   5   5
##                E   0   0   5   0 127   3   1   1   0   0   3   4   0   0   0
##                F   0   0   0   0   0 138   2   2   6   0   0   0   0   0   0
##                G   1   1   2   1   9   2 123   2   0   0   1   2   1   0   1
##                H   0   0   0   1   0   1   0 102   0   2   3   2   3   4  20
##                I   0   1   0   0   0   1   0   0 141   8   0   0   0   0   0
##                J   0   1   0   0   0   1   0   2   5 128   0   0   0   0   1
##                K   1   1   9   0   0   0   2   5   0   0 118   0   0   2   0
##                L   0   0   0   0   2   0   1   1   0   0   0 133   0   0   0
##                M   0   0   1   1   0   0   1   1   0   0   0   0 135   4   0
##                N   0   0   0   0   0   1   0   1   0   0   0   0   0 145   0
##                O   1   0   2   1   0   0   1   2   0   1   0   0   0   1  99
##                P   0   0   0   1   0   2   1   0   0   0   0   0   0   0   2
##                Q   0   0   0   0   0   0   8   2   0   0   0   3   0   0   3
##                R   0   7   0   0   1   0   3   8   0   0  13   0   0   1   1
##                S   1   1   0   0   1   0   3   0   1   1   0   1   0   0   0
##                T   0   0   0   0   3   2   0   0   0   0   1   0   0   0   0
##                U   1   0   3   1   0   0   0   2   0   0   0   0   0   0   1
##                V   0   0   0   0   0   1   3   4   0   0   0   0   1   2   1
##                W   0   0   0   0   0   0   1   0   0   0   0   0   2   0   0
##                X   0   1   0   0   2   0   0   1   3   0   1   6   0   0   1
##                Y   3   0   0   0   0   0   0   1   0   0   0   0   0   0   0
##                Z   2   0   0   0   1   0   0   0   3   4   0   0   0   0   0
##                 
## data_predictions   P   Q   R   S   T   U   V   W   X   Y   Z
##                A   0   5   0   1   1   1   0   1   0   0   1
##                B   2   2   3   5   0   0   2   0   1   0   0
##                C   0   0   0   0   0   0   0   0   0   0   0
##                D   3   1   4   0   0   0   0   0   3   3   1
##                E   0   2   0  10   0   0   0   0   2   0   3
##                F  16   0   0   3   0   0   1   0   1   2   0
##                G   2   8   2   4   3   0   0   0   1   0   0
##                H   0   2   3   0   3   0   2   0   0   1   0
##                I   1   0   0   3   0   0   0   0   5   1   1
##                J   1   3   0   2   0   0   0   0   1   0   6
##                K   1   0   7   0   1   3   0   0   5   0   0
##                L   0   1   0   5   0   0   0   0   0   0   1
##                M   0   0   0   0   0   3   0   8   0   0   0
##                N   0   0   3   0   0   1   0   2   0   0   0
##                O   3   3   0   0   0   3   0   0   0   0   0
##                P 130   0   0   0   0   0   0   0   0   1   0
##                Q   1 124   0   5   0   0   0   0   0   2   0
##                R   1   0 138   0   1   0   1   0   0   0   0
##                S   0  14   0 101   3   0   0   0   2   0  10
##                T   0   0   0   3 133   1   0   0   0   2   2
##                U   0   0   0   0   0 152   0   0   1   1   0
##                V   0   3   1   0   0   0 126   1   0   4   0
##                W   0   0   0   0   0   4   4 127   0   0   0
##                X   0   0   0   1   0   0   0   0 137   1   1
##                Y   7   0   0   0   3   0   0   0   0 127   0
##                Z   0   0   0  18   3   0   0   0   0   0 132

  根据结果显示,测试集前六行预测结果分别为U、N、X、N、H,同时我们可以看出预测值与真实值相匹配的记录。

2.模型结果总览
  运行代码:

data_agreement<-data_predictions==data_test$letter
table(data_agreement)
prop.table(table(data_agreement))

  结果展示:

> table(data_agreement) 
## data_agreement
## FALSE  TRUE 
##   643  3357
> prop.table(table(data_agreement))
## data_agreement
##   FALSE    TRUE 
## 0.16075 0.83925

  根据模型测试结果,模型准确率83.925%,拟合效果较好,但可以考虑利用其它核函数类型优化模型。这里采用指定径向基函数进行数据拟合。

3.2.4 提高模型的性能

  通过改变支持向量机核函数优化模型。
  运行代码:

data_classifier_rbf<-ksvm(letter~.,data=data_train,kernel="rbfdot")
data_predictions_rbf<-predict(data_classifier_rbf,data_test)
data_agreement_rbf<-data_predictions_rbf==data_test$letter
table(data_agreement_rbf)
prop.table(table(data_agreement_rbf))

  结果展示:

> table(data_agreement_rbf)
## data_agreement_rbf
## FALSE  TRUE 
##   278  3722
> prop.table(table(data_agreement_rbf))
## data_agreement_rbf
##  FALSE   TRUE 
## 0.0695 0.9305

  根据改变核函数类型发现,我们可以将字符准确率从84%提高到93%,模型拟合效果大大提高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业级大数据安全架构(十一)Kerberos接入dophinscheduler

作者&#xff1a;楼高 建议将dophinscheduler集成到Ambari安装部署&#xff0c;在Ambari上面开启kerberos 1.安装准备 编译 从GitHub获取dolphinscheduler-1.3.9源码 git clone https://github.com/apache/dolphinscheduler.git -b 1.3.9-releasehttps://github.com/apache/…

多输入回归预测|GWO-CNN-LSTM|灰狼算法优化的卷积-长短期神经网络回归预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 灰狼优化算法&#xff1a; 卷积神经网络-长短期记忆网络&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容…

java日志框架总结(七、使用过滤器自动打印接口入参、出参)

使用过滤器自动打印接口入参、出参首先要了解一个过滤器OncePerRequestFilter&#xff0c;一般使用这个过滤器进行日志打印。 一、OncePerRequestFilter 1)、什么是OncePerRequestFilter 回顾一下 Filter 的工作原理。Filter 可以在 Servlet 执行之前或之后调用。当请求被调度…

ChatGPT/GPT4科研应用与AI绘图及论文写作

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

重看LeakCanary

LeakCanary是我很久之前看的东西了&#xff0c;我当时侯对它的印象就是它可以用来检测内存泄漏&#xff0c;具体原理就是将弱引用对象延迟个5s然后看是否被回收,如果没有被回收,那么就说明发生了内存泄漏,其他的也没有仔细地看 现在就详细地梳理一遍这个流程&#xff1a; 1.L…

微服务篇之分布式事务

一、Seata架构 Seata事务管理中有三个重要的角色&#xff1a; TC (Transaction Coordinator) - 事务协调者&#xff1a;维护全局和分支事务的状态&#xff0c;协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器&#xff1a;定义全局事务的范围、开始全局事务、…

docker学习总结

docker 1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker 2.Docker的基本操…

Kubernetes Prometheus 系列|Prometheus介绍和使用|Prometheus+Grafana集成

目录 第1章Prometheus 入门1.1 Prometheus 的特点1.1.1 易于管理1.1.2 监控服务的内部运行状态1.1.3 强大的数据模型1.1.4 强大的查询语言 PromQL1.1.5 高效1.1.6 可扩展1.1.7 易于集成1.1.8 可视化1.1.9 开放性 1.2 Prometheus 的架构1.2.1 Prometheus 生态圈组件1.2.2 架构理…

Go 数据库编程精粹:database/sql 实用技巧解析

Go 数据库编程精粹&#xff1a;database/sql 实用技巧解析 简介database/sql 库的基础知识核心概念连接池驱动事务 环境配置 建立数据库连接连接到数据库示例&#xff1a;连接 MySQL 数据库连接池管理 执行查询和处理结果基本查询执行多行查询执行单行查询 结果处理处理多行结果…

基于Java SSM框架实现问卷调查系统项目【项目源码】

基于java的SSM框架实现问卷调查系统演示 B/S结构 BROWSER/SERVER程序架构方式是使用电脑中安装的各种浏览器来进行访问和使用的&#xff0c;相比C/S的程序结构不需要进行程序的安装就可以直接使用。BROWSER/SERVER架构的运行方式是在远程的服务器上进行安装一个&#xff0c;然…

普中51单片机学习(DS1302)

DS1302时钟 DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力&#xff0c;还有闰年调整的能力。内部含有31个字节静态RAM&#xff0c;可提供用户访问。采用串行数据传送方式&#xff0c;使得管脚数量最少&#xff0c;简单SPI 3线接口。工作电压…

4.8 Verilog过程连续赋值

关键词&#xff1a;解除分配&#xff0c;强制&#xff0c;释放 过程连续赋值是过程赋值的一种。赋值语句能够替换其他所有wire 或 reg 的赋值&#xff0c;改写wire 或 reg 类型变量的当前值。 与过程赋值不同的是&#xff0c;过程连续赋值表达式能被连续的驱动到wire 或 reg …

C++——基础语法(2):函数重载

4. 函数重载 函数重载就是同一个函数名可以重复被定义&#xff0c;即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢&#xff1f;所以同一个函数名的函数之间肯定是要存在不同点的&#xff0c;除了函数名外&#xff0c;还有返回类型和参数两部分可以…

Composition API 和 Options API

为什么Composition API 比 Options API 更好 Composition API是Vue.js 3.x版本引入的一种新的组织代码的方式。它相对于Options API有一些明显的优势&#xff0c;使得它在某些场景下更加灵活和易于使用。 更好的逻辑组织&#xff1a;Composition API允许将相关代码逻辑打包在一…

如何进行数据库分区和分片操作?

什么是数据库分区和分片&#xff1f; 数据库分区和分片都是数据库物理设计中的技术&#xff0c;旨在提高数据库的性能和管理大规模数据。 数据库分区是一种物理数据库的设计技术&#xff0c;其主要目的是在特定的SQL操作中减少数据读写的总量以缩减响应时间。分区并不是生成新…

mysql 输出所在月份的最后一天

内置函数 LAST_DAY(date) 参数&#xff1a; date &#xff1a;一个日期或日期时间类型的值&#xff0c;表示要获取所在月份最后一天的日期。 返回值&#xff1a; 返回一个日期值&#xff0c;表示输入日期所在月份的最后一天。 栗子 月总刷题数和日均刷题数_牛客题霸_牛客…

本地配置多个git账户及ll设置

本地配置多个git账户 清除全局配置将命令行&#xff0c;切换到ssh目录生成GitLab和Gitee的公钥、私钥去对应的代码仓库添加 SSH Keys添加私钥ll设置 管理密钥验证仓库配置关于gitgitee.com: Permission denied (publickey) 清除全局配置 此步骤可以不做&#xff0c;经测试不影…

总结一下最近几个主界面

目前展示了用Avalonia做几个主要流行的主界面&#xff0c;演示了一下组件的使用。用不同的实现方式实现一些方法。 1、独立大屏展示&#xff0c;类似一个实时监控&#xff0c;这是一种目前很方便的大屏效果。 主要涉及的内内容&#xff1a; &#xff08;1&#xff09;窗标题实…

【视频编码\VVC】环路滤波基础知识

本文为新一代通用视频编码H.266\VVC原理、标准与实现的简化笔记。 定义&#xff1a;在视频编码过程中进行滤波&#xff0c;滤波后的图像用于后续编码。 目的&#xff1a;1、提升编码图像的质量。2、为后续编码图像提供高质量参考&#xff0c;获得更好的预测效果。 VVC中主要…

使用LinkedList实现堆栈及Set集合特点、遍历方式、常见实现类

目录 一、使用LinkedList实现堆栈 堆栈 LinkedList实现堆栈 二、集合框架 三、Set集合 1.特点 2.遍历方式 3.常见实现类 HashSet LinkedHashSet TreeSet 一、使用LinkedList实现堆栈 堆栈 堆栈&#xff08;stack&#xff09;是一种常见的数据结构&#xff0c;一端…