机器学习基础-Knn分类器

问题概述:K 近邻算法是分类数据最简单有效的算法,它采用基于实例的学习方法。简单地说,它采用测量不同样本之间距离的方法进行分类。它的工作原理是:存在一个样本数据集合,也称为训练样本集,并且样本集中的每个数据都有标签,即我们知道每个数据所属的分类。输入没有标签的新数据后,将新数据的每个特征与样本集中数据的对应特征进行比较,然后算法 取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前 K个最相似的数据,这就是 K 近邻算法中K 的出处。最后,选择K 个最相似数据中出现次数最多的分类,作为新数据的分类。

由以上述可得知,使用 K近邻算法对某个新数据进行分类的伪代码如下:

(1)、计算训练样本集中的各样本与当前数据之间的距离;

(2)、按照距离递增顺序排序;

(3)、选取与当前数据距离最小的K 个样本;
(4)、确定前K 个样本所在类别的出现频率;

(5)、返回前K 个样本出现频率最高的类别作为当前数据的预测类别。要求设计和实现类KnnNumber,构造一个使用K 近邻分类器的手写识别系统,该系统可以识别数字0 9。需要识别的数字已经处理成具有相同的色彩和大小:使用文本格式表示的32 像素*32像素黑白图像(0/1二值图像)。数据集在 digits.zip中,其中目录 trainingDigits包含了训练样本集,其中包含了大约 2000个样本数据,每个数据的文件名表明了它的标签(0~9中的某个数字),每个数字大约有 200个样本数据;目录 testDigits中包含了大约 900个测试数据。请合理设计 KnnNumber的数据成员和成员方法,以实现算法的各个步骤。将 K 取值

[3, 9]之间的一个整数,找出分类准确率最高的K 值。 

提示:

(1)、计算距离时采用欧几里得距离;

(2)、可将每个数字图像文件转换为1*1024 的一维数组,于是整个训练样本集可以表示为2000*1024 的二维数组。


声明静态方法trainAllDate(),读取digitstrainingDigits目录下的各个文件,声明int[]型容器trainDigit用来存放各个训练样本数据,声明Integer类型容器存放各个训练样本标签。声明int[]容器testDigit存放各个测试数据,声明Integer类型容器testAnswer存放各个测试标签。声明Distance类,三个数据成员,分别为dis表示各个训练样本到某个测试样本的欧几里得距离的平方,n为各个训练样本的编号,ans为各个训练样本的标签。遍历整个testDigit,对每个测试数据,用一个Distance类型的容器存放它到各个样本数据的欧几里得距离的平方,声明Mycomparator实现了Comparator接口,实现了按Distance类型中的dis由小到大排序。最后取出前kDistance实例的样本标签,就作为对该测试数据的预测结果。用一个Integer类型的容器TAnswer存放对各个测试数据的预测结果。最后与给出的测试标签相比较,计算出Knn算法预测的正确率。

   在实验中,最开始采用了LinkedList容器存放样本数据,然后用索引进行遍历,速度慢的无法想象,后来改成ArrayList解决了该问题。

ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。


k=3时,946个测试数据中有934个预测正确,有最大的正确率0.9873150105708245



运行结果:

k = 3

correctcase=934

sumcase=946

correctrate=0.9873150105708245


k = 4

correctcase=930

sumcase=946

correctrate=0.9830866807610994


k = 5

correctcase=927

sumcase=946

correctrate=0.9799154334038055


k = 6

correctcase=924

sumcase=946

correctrate=0.9767441860465116


k = 7

correctcase=924

sumcase=946

correctrate=0.9767441860465116


k = 8

correctcase=923

sumcase=946

correctrate=0.9756871035940803


k = 9

correctcase=920

sumcase=946

correctrate=0.9725158562367865


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值