网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
引言
手写识别也是当前机器学习的一大热点,数字手写识别是手写识别中的基础,我们用到的是knn算法,今天给大家讲一下我的实现方法;
环境
IDE:Eclipse
语言:Java
项目:数字手写识别
思路
数据采集:我们知道,一张图片可以被看作一个个点组成的矩阵,对于手写数字,我们只要创建一个全0数组当作背景,手写完毕把数字所占区域置为1,就可以保存当作一个样本了,如下图所示。
算法:KNN算法,其距离度量我们采用欧拉距离。
欧拉距离计算方法:我们将数组看作40*40向量,采用距离公式计算。
这里写图片描述
实现
一、面板
请原谅作者对于美笨拙的感知,我所绘制的界面不能够再简单了。如图:
面板按钮介绍:
- Identify:识别手写的数字;
- Save this example: 保存这个样例到数据集;
- 数字下拉框:相当于保存数据集的标签,例如,要保存手写“2”,先下拉选好2再保存即可
二、存储
在数据读取存储上走了很多弯路,之后要好好总结下数据流的几个传输方式。
我们将每张图片转化为一个二维数组后,存放进一个txt文件中。对于每个单独的文件,我们要产生一个独一无二的文件名,所以文件取名方式采取“数字+随机id .txt”的格式命名,随机id我们通过构造UID对象,获取其hashcode值作为id。
//获取下拉框选中的数字
String selectedNumber=cbItem.getSelectedItem().toString();
UID id=new UID();
//文件的前缀路径
String rootPath="C:\\Users\\DearYou\\eclipse-workspace\\GUI\\src\\Demo\\handwritingIdentify\\TrainingData\\";
//生成文件名
String fileName=selectedNumber+"-"+id.hashCode();
//生成绝对路径下的一个文件
String absoluteFile=rootPath+fileName+".txt";
File file=new File(absoluteFile);
try {
//创建文件
if(!file.exists())
file.createNewFile();
//将数组写入文件
![img](https://img-blog.csdnimg.cn/img_convert/e00948b7f70a61f22a2f6d03fbabdbbb.png)
![img](https://img-blog.csdnimg.cn/img_convert/5cdb747defb49c06107764a823fafe4a.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**