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

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

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

文章目录

  • [1 目的](#1 目的)
  • [2 数据来源](#2 数据来源)
  • [3 案例演示](#3 案例演示)
    • [3.1 探索数据](#3.1 探索数据)
    • [3.2 模型的建立及优化](#3.2 模型的建立及优化)
      • [3.2.1 创建训练集和测试集](#3.2.1 创建训练集和测试集)
      • [3.2.2 基于数据训练模型](#3.2.2 基于数据训练模型)
      • [3.2.3 评估模型性能](#3.2.3 评估模型性能)
      • [3.2.4 提高模型的性能](#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%,模型拟合效果大大提高。

相关推荐
Jerry2 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry4 小时前
LeetCode 459. 重复的子字符串
算法
海石7 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石7 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry9 小时前
LeetCode 151. 反转字符串中的单词
算法
a11177611 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜11 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry12 小时前
LeetCode 541. 反转字符串 II
算法
Jerry12 小时前
LeetCode 344. 反转字符串
算法
搞科研的小刘选手12 小时前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议