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

🍉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%,模型拟合效果大大提高。

相关推荐
reset20215 分钟前
支持向量机(SVM)原理与应用
人工智能·机器学习·支持向量机
Yzzz-F7 分钟前
Problem - D - Codeforces
算法
chas_8811 分钟前
macbook air M5 32G本地跑ddtree-mlx效果
算法
programhelp_12 分钟前
WeRide OA 2026 高频真题分享 & 详细备战指南
经验分享·算法·面试·职场和发展
Mr数据杨34 分钟前
Unlearnable CIFAR 10 图像分类实战 从异常训练数据到鲁棒建模
人工智能·机器学习·分类·数据挖掘·数据分析·kaggle
Mr数据杨34 分钟前
短文本意图分类助力智能客服自动化服务
机器学习·分类·数据挖掘·数据分析·自动化·kaggle
菜菜的顾清寒37 分钟前
Leetcode (18) 力扣100 矩阵置零
算法
董董灿是个攻城狮1 小时前
5分钟搞懂微调的能力退化问题
算法
Mr数据杨1 小时前
医学影像分类实战复盘 从课程赛题到可落地建模流程
人工智能·机器学习·分类·数据挖掘·数据分析·kaggle
穿条秋裤到处跑1 小时前
每日一道leetcode(2026.04.19):下标对中的最大距离
算法·leetcode·职场和发展