最全数字手写识别——Java实现KNN算法_java图片识别数字,2024年最新帮你解决90%的问题

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

面板按钮介绍

  • 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();
                //将数组写入文件
                FileWriter out = new FileWriter(file);
                for(int i=0;i<40;i++) {
                    for(int j=0;j<40;j++) {
                        out.write(pixel[i][j]+"");
                    }
                }
                out.flush();
                out.close();
            }catch(Exception e1) {
                e1.printStackTrace();
            }
三、Knn算法实现

Common thinking :KNN目的是找到k个离测试样本最近的训练样本,看了下同学的方法,大多都使用了排序,但自己想想排序实在是多余,一个排序就将复杂度升到了O(nlgn),数据容量一大,性能就会下降。
My thinking:我想我们只要找到k个距离最近的样本,和顺序并没有关系。笔者细想了一下,我么只要构建一个大小为k的数组或者队列,对于前k个元素,我们直接放进数组,后面的n-k个元素,我们找到存放在数组中的k个元素中最大值,将二者比较看是否替代。这样我们只需遍历一遍,复杂度降为O(n),也是一种小优化。

    伪代码:
    KnnNode[] dist=new KnnNode[k];
    for(int i=0->k){
        KnnNode temp=new KnnNode(distance);
        dist.append(temp)
    }
    for(the rest of test set){
        if(temp.distance < the maximum element in dist)
            dist[index of max]=temp;
    }
四、预测

方法如下展示:
这里写图片描述
我们也可以在识别之后保存该样本,这样不能不断扩大数据集,让精度更高。


总结

虽然能在O(n)复杂度里实现Knn算法,但是我的knn延展性太差,我应该可以把这个knn的参数换成算好的距离,而不是传入的数组,这样就能将这个KNN封装好方便以后再用。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值