手写java_JAVA实现简单手写识别

作为一个机器学习的初学者,首先肯定是要有点自己的对机器学习的看法的。 我认为的机器学习(在我目前接触到的知识来说。!!(大佬勿喷)),机器学习专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。也就是说我们需要通过研究人类学习的过程,也就是积累过程,来为机器提供这样一个环境,所以说就需要有大量的样本来为机器提供条件,通过提高代码质量,为机器提供更快更有效的方法来模拟。 还是回到自己的简易手写识别上来,几个月重新拾起JAVA对于一个本来基础就不大好的我,也是特别困难的,当初手写识别写了一部分落下,近几天也相当于重新开始写这串代码。

**一.手写识别初探(之后有改进)**

手写识别(HandWriting Recognition)是指将在手写设备上书写时产生的有序轨迹信息化转化为汉字内码的过程,实际上是手写轨迹的坐标序列到汉字的内码的一个映射过程,是人机交互最自然、最方便的手段之一。

五子棋,我上篇好像也有淡淡的扯过,划线布局分部也就差不多,重要的是通过鼠标在画布上的判断来讲布局用二维数组表达出来。

也就是计算鼠标拖动的着落点入落在所画的方格类进行判断,然后再依次存到数组里面,并将其用文件输出流保存起来。 所以通过动作监听将这些样本存入文本文档中。然后再将文本文档读到另一个数组里。鉴于初学只能写了一个简单的算法得到C值。fa[c]就是相比对之下最精确样本所在处。然后输出。

**二. 手写识别改进**

相比于方格二维数组的判断,我用到一个类Piexlgrabber像素抓取,之后画板明亮的多。感觉效果也好多了。

我来简单介绍一下使用。参数是(IMAGE,image的初始位置x,image初始位置y,off,scansize)。

其实就是pix[(j - y) * scansize + (i - x) + off]这个公式,很容易理解的。

首先先通过bufferimage画笔将数字划到与面板大小相同的bufferimage上,然后再来一个bufferimage2将第一个画布画到第二张画布上,相当于缩小画布,然后用画布二进行像素依次存到数组里面,Piexlgrabber里API里面有其使用方法。然后同上进行数组的上的比对,由于缩小后像素的不清楚 我们可以加到画笔的宽度。得到更加明显的效果

然后进行像素点所在位置比对得到数据再进行判断。

**三.算法介绍**

**欧式距离算法**

欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。

二维空间的公式

0ρ = sqrt( (x1-x2)^2+(y1-y2)^2 ) |x| = √( x2 + y2 );

**KNN算法** K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。

该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

1. 准备数据,对数据进行预处理

2. 选用合适的数据结构存储训练数据和测试元组

3. 设定参数,如k

4. 维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列

5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L 与优先级队列中的最大距离Lmax

6. 进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L < Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队列

7. 遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别

8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。 然后将文件里面的文本读出来一 一拿出来进行比对 将结果存到aver数组里面。之后再通过将误差最小的样本比对出来

希望对大家有帮助。~!~!~!~!~!~(初学望大家支持)。

你可能感兴趣的:(手写java)