当前位置:   article > 正文

SVM算法实现光学字符识别_svm字符识别

svm字符识别

目录

1、数据来源

2、数据预处理

3、模型训练

4、模型性能评估

5、模型性能提升

5.1、核函数的选取

5.2、惩罚参数C的选取


OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机字符的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过字符识别模型将图像中的文字处理成文本格式。

光学字符识别是OCR的核心,然而对于许多类型的机器学习算法来说,这种图像处理都是一项艰巨的任务。 将像素模式连接到更高概念的关系是极其复杂的,而且很难定义。 例如,让一个人识别一张面孔、一只猫或字母A是容易的,但用严格的规则来定义这些模式是很困难的。 此外,图像数据往往是噪声数据,对于光学字符图像,灯光、定位和对象的位置都能影响最终的图像数据。

支持向量机非常适合处理图像数据,它能够学习复杂的图案而不需要对噪声数据过度敏感,能够以较高的准确度识别光学图案。

1、数据来源

本博文中,将使用UCI公开的光学字符识别数据集(UCI Machine Learning Repository: Letter Recognition Data Set),利用支持向量机(SVM)来构建光学字符识别模型。

该数据集包含了26个英文大写字母的20000个样本。 每一个样本代表光学图像中的一个矩形区域,该区域只包含单一字符。 每一个样本包含16个自变量和letter目标变量,letter指示当前样本是哪一个字母。每一个特征变量的具体含义如下:

  • letter 字符 (取值为A,B,...,Z)
  • x-box 字符所在矩形区域的水平位置
  • y-box 字符所在矩形区域的竖直位置
  • width 矩形区域的宽度
  • high 矩形区域的高度
  • onpix 矩阵区域的黑色像素数
  • x-bar 矩形区域内黑色像素的平均x值
  • y-bar 矩形区域内黑色像素的平均y值
  • x2bar x平均方差
  • y2bar y平均方差
  • xybar x和y的平均相关性
  • x2ybr x * x * y 均值
  • xy2br x * y * y 均值
  • x-ege 从左到右的边缘数目
  • xegvy x边缘与y的相关性
  • y-ege 从下到上的边缘数目
  • yegvx y边缘与x的相关性

2、数据预处理

光学字符识别数据集中包含16个特征变量,这些变量用字符矩形区域的水平位置和竖直位置、黑色像素比例、黑色像素的平均水平和竖直位置来度量一个字符。

首先,使用pandas中的read_csv()函数将数据导入,实现代码如下所示:

  1. import pandas as pd

  2. letters = pd.read_csv("./input/letterecognition.csv")

  3. letters.head(10)

前10行数据格式如下所示:

接下来使用pandas中Series的value_counts()函数,观察数据集中每一种字符的数量分布。

sort_index()函数可以让结果按照字母排序展示结果,实现代码如下所示:

letters["letter"].value_counts().sort_index()

效果如下所示:

可见,各个字符的样本数量分布相对均衡。

现在,进一步观察每一个自变量的取值分布,实现代码如下所示:

letters.iloc[:,1:].describe()

数据取值分布如下所示: 

xboxyboxwidthheightonpixxbarybarx2bary2barxybarx2ybarxy2barxedgexedgeyyedgeyedgex
count20000.00000020000.00000020000.00000020000.0000020000.00000020000.00000020000.00000020000.00000020000.00000020000.00000020000.0000020000.00000020000.00000020000.00000020000.00000020000.00000
mean4.0235507.0355005.1218505.372453.5058506.8976007.5004504.6286005.1786508.2820506.454007.9290003.0461008.3388503.6917507.80120
std1.9132123.3045552.0145732.261392.1904582.0260352.3253542.6999682.3808232.4884752.631072.0806192.3325411.5467222.5670731.61747
min0.0000000.0000000.0000000.000000.0000000.0000000.0000000.0000000.0000000.0000000.000000.0000000.0000000.0000000.0000000.00000
25%3.0000005.0000004.0000004.000002.0000006.0000006.0000003.0000004.0000007.0000005.000007.0000001.0000008.0000002.0000007.00000
50%4.0000007.0000005.0000006.000003.0000007.0000007.0000004.0000005.0000008.0000006.000008.0000003.0000008.0000003.0000008.00000
75%5.0000009.0000006.0000007.000005.0000008.0000009.0000006.0000007.00000010.0000008.000009.0000004.0000009.0000005.0000009.00000
max15.00000015.00000015.00000015.0000015.00000015.00000015.00000015.00000015.00000015.00000015.0000015.00000015.00000015.00000015.00000015.00000

观察发现16个自变量的取值范围都在0~15之间,因此对于该数据集不需要对变量进行标准化操作。

此外,数据集作者已经将样本随机排列,所以也不需要我们对数据进行随机打散。 此处,直接取前14000个样本(70%)作为训练集,后6000个样本(30%)作为测试集,实现代码如下所示:

  1. letters_train = letters.iloc[0:14000,]

  2. letters_test = letters.iloc[14000:20000,]

3、模型训练

接下来使用sklearn.svm包中的相关类来实现来构建基于支持向量机的光学字符识别模型。

在sklearn.svm包中,有三个类均实现了支持向量机算法:SVC, NuSVC 和 LinearSVC。 SVC 和 NuSVC接受的参数有细微差别,且底层的数学形式不一样。 而 LinearSVC 则是使用简单的线性核函数,其实现基于liblinear (LIBLINEAR -- A Library for Large Linear Classification), 对于大规模的样本训练速度会更快。 这三个支持向量机的具体介绍参考sklearn官方文档:1.4. Support Vector Machines — scikit-learn 1.1.1 documentation

本案例中,选用 SVC 来进行模型构建。 SVC 有两个主要的参数可以设置:核函数参数 kernel 和约束惩罚参数C。 核函数参数 kernel的常用取值及其对应含义如下:

  • "linear":线性核函数
  • "poly":多项式核函数
  • "rbf":径向基核函数
  • "sigmoid": sigmoid核函数

约束惩罚参数C为对超过约束条件的样本的惩罚项。C值越大,惩罚越大,支持向量机的决策边界越窄。

现在,可以使用训练集构建分类模型了,选用最简单的线性核函数,C采用默认值1。实现代码如下所示:

  1. from sklearn.svm import SVC

  2. letter_recognition_model = SVC(C = 1, kernel = "linear")

  3. letter_recognition_model.fit(letters_train.iloc[:,1:],letters_train['letter'])

设置成功后,SVC配置参数效果如下所示:

  1. SVC(C=1, cache_size=200, class_weight=None, coef0=0.0,

  2. decision_function_shape=None, degree=3, gamma='auto', kernel='linear',

  3. max_iter=-1, probability=False, random_state=None, shrinking=True,

  4. tol=0.001, verbose=False)

4、模型性能评估

接下来,使用predict()函数得到上一节训练的支持向量机模型在测试集合上的预测结果,然后使用 sklearn.metrics中的相关函数对模型的性能进行评估,实现代码如下所示:

  1. from sklearn import metrics

  2. letters_pred = letter_recognition_model.predict(letters_test.iloc[:,1:])

  3. print(metrics.classification_report(lettters_test["letter"], letters_pred))

  4. print(pd.DataFrame(metrics.confusion_matrix(lettters_test["letter"], letters_pred),\

  5. columns = letters["letter"].value_counts().sort_index().index,\

  6. index = letters["letter"].value_counts().sort_index().index))

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:SVM算法实现光学字符识别

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/385325
推荐阅读
相关标签
  

闽ICP备14008679号