手写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数组里面。之后再通过将误差最小的样本比对出来

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现手写数字识别可以采用机器学习的方法,其中比较常用的是神经网络。以下是一个简单Java 实现手写数字识别的示例: 1. 数据集准备 首先需要准备一个手写数字的数据集,可以使用 MNIST 数据集,包含了 60000 张训练数据和 10000 张测试数据,每张图片都是 28x28 的灰度图像。可以从 http://yann.lecun.com/exdb/mnist/ 下载数据集。 2. 数据预处理 将数据集中的图像转换为向量,可以将每个像素点的值除以 255,将其归一化到 0-1 的范围内。然后将图像展开成一维向量,作为神经网络的输入。 3. 神经网络模型设计 可以采用多层感知器(Multilayer Perceptron,MLP)作为神经网络模型。MLP 由输入层、隐藏层和输出层组成,每个神经元都与前一层的所有神经元相连。在每个神经元上都有一个激活函数,用于计算神经元的输出。 4. 训练模型 可以使用反向传播算法(Backpropagation,BP)来训练神经网络模型。首先初始化模型的参数,然后使用训练数据集来更新参数。在每个训练样本上计算模型的输出和损失函数,然后根据损失函数的梯度来调整模型的参数。 5. 测试模型 使用测试数据集来评估模型的性能。将测试数据集输入到训练好的模型中,然后计算模型的输出和正确标签之间的误差。可以使用准确率和混淆矩阵来评估模型的性能。 以上是一个简单Java 实现手写数字识别的示例,具体实现细节和代码实现可以根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值