java knn储存模型_数据挖掘:K最近邻(KNN)算法的java实现

本文介绍了K最近邻(KNN)算法,属于懒惰学习的一种,适用于小规模数据集且属性为数值类型。KNN算法原理是通过计算训练元组与测试元组之间的距离找到最近的k个邻居,然后根据多数类别进行预测。文章详细讨论了算法的优缺点、距离度量、参数选择、数据预处理和实现策略,并提供了简单的Java代码实现。
摘要由CSDN通过智能技术生成

1.急切学习与懒惰学习

急切学习:在给定训练元组之后、接收到测试元组之前就构造好泛化(即分类)模型。

属于急切学习的算法有:决策树、贝叶斯、基于规则的分类、后向传播分类、SVM和基于关联规则挖掘的分类等等。

懒惰学习:直至给定一个测试元组才开始构造泛化模型,也称为基于实例的学习法。

属于急切学习的算法有:KNN分类、基于案例的推理分类。

2.KNN的优缺点

优点:原理简单,实现起来比较方便。支持增量学习。能对超多边形的复杂决策空间建模。

缺点:计算开销大,需要有效的存储技术和并行硬件的支撑。

3.KNN算法原理

基于类比学习,通过比较训练元组和测试元组的相似度来学习。

将训练元组和测试元组看作是n维(若元组有n的属性)空间内的点,给定一条测试元组,搜索n维空间,找出与测试

元组最相近的k个点(即训练元组),最后取这k个点中的多数类作为测试元组的类别。

相近的度量方法:用空间内两个点的距离来度量。距离越大,表示两个点越不相似。

距离的选择:可采用欧几里得距离、曼哈顿距离或其它距离度量。多采用欧几里得距离,简单!

4.KNN算法中的细节处理

数值属性规范化:将数值属性规范到0-1区间以便于计算,也可防止大数值型属性对分类的主导作用。

可选的方法有:v' = (v - vmin)/ (vmax - vmin),当然也可以采用其它的规范化方法

比较的属性是分类类型而不是数值类型的:同则差为0,异则差为1.

有时候可以作更为精确的处理,比如黑色与白色的差肯定要大于灰色与白色的差。

缺失值的处理:取最大的可能差,对于分类属性,如果属性A的一个或两个对应值丢失,则取差值为1;

如果A是数值属性,若两个比较的元组A属性值均缺失,则取差值为1,若只有一个缺失,另一个值为v,

则取差值为|1-v|和|0-v|中的最大值

确定K的值:通过实验确定。进行若干次实验,取分类误差率最小的k值。

对噪声数据或不相关属性的处理:对属性赋予相关性权重w,w越大说明属性对分类的影响越相关。对噪声数据可以将所在

的元组直接cut掉。

5.KNN算法流程

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

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

设定参数,如k

维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组

随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列

遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L与优先级队列中的最大距离Lmax进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L

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

测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k值。

6.KNN算法的改进策略

将存储的训练元组预先排序并安排在搜索树中(如何排序有待研究)

并行实现

部分距离计算,取n个属性的“子集”计算出部分距离,若超过设定的阈值则停止对当前元组作进一步计算。转向下一个元组。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值