(一)机器学习之kNN算法理论实战讲解(验证码识别)

机器学习之Knn算法(Python实现)

作者: AlexTan 
CSDN: 
http://blog.csdn.net/alextan_ 
e-mail: [email protected] 
Github: 
https://github.com/AlexTan-b-z

1. knn算法(邻近算法)介绍:

邻近算法,或者说K最近邻(kNNk-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

2. 理论介绍:

 

先说,邻近算法是一种分类算法,可以用来解决一些简单的分类需求,具体一点,就好比如说解决一些简单的验证码识别问题。

1. 问题一:如图,在图中的直角坐标系中,我们有四种已有的图案(圆、等腰三角形、直角三角形、等腰梯形),假设世界上只有这四种类型的图案。现有一个我们不知道是什么类型的图案(图中的六边形)。那么,我们怎么判断这个图案属于哪一类呢?

我们利用kNN算法,首先,确定k=5,意思就是,我们找出离这个图案最近的五个图案 出来,然后哪一类的占比在这5个图案中最多,那么这个图案就属于哪一类。

2. 问题二:我们怎么计算距离呢?

   这可以用中学的数学知识解决,即计算欧几里得距离,可能大家对这个名词有点陌生,那么下面这个肯定就不陌生了:勾股定理!  欧几里得距离也就是有勾股定理演变而来的,具体公式如下:

|x| = √( x[1]^2 + x[2]^2 + … + x[n]^2 )

 

说明: 这个符号代表开根号的意思;

n代表n个维度,即当n=2时,|x| = (x1-x2)^2 + (y1-y2)^2

x[1] 代表两个点在同一纬度的数值差,如当在x轴时,x[1]=x1 - x2

 

3. 实战运用:

我这里运用的是识别数字验证码,验证码是我们学校里的教务在线登陆验证码。验证码比较简单,具体如下:

      

这种形式的验证码,python有一个第三包来实现将图片中的文字转文本(主要是英文),这个包叫:pyteeser,是谷歌OCR开源项目的一个模块。但由于上图中的验证码有一些奇怪的斜线之类的,是图中的文字模糊化了,识别效果很不好,所以可以自己写了一个基于kNN实现的验证码识别。

具体思路如下:

1. 首先,训练数据:

i. 去大量的下载验证码图片,把每张图片等比例拆分成5部分(即每一部分代表验证码图片中的一个数字),然后生成新的图片,每一张图片都是一个数字,图片分辨率为10x20。

ii. 然后利用Python的Pillow和Numpy模块,把图片中颜色是黑色的像素点转化成数字1,否则为数字0,生成一个一维数组,然后再利用numpy里的savetxt函数把一维数组保存为txt文件,得到训练数据,文件命名为图片中的具体数字(这里可以半人工来训练数据,也可以通过云打码平台来自动生成训练数据)

iii. 最后根据训练数据,用kNN算法来实现对验证码的识别(可以说是验证码图片中的每个数字分类)。

最后,具体代码以及数据已发GitHub,代码中有详细数据,如有问题,欢迎留言。

猜你喜欢

转载自blog.csdn.net/alextan_/article/details/78494892