文档详情

2024年knn算法实验报告.doc

发布:2024-10-10约8.11千字共22页下载文档
文本预览下载声明

KNN算法试验汇报

一试验原理

K近来邻(k-NearestNeighbor,KNN)分类算法,是一种理论上比较成熟的措施,也是最简朴的机器学习算法之一。

该措施的思绪是:假如一种样本在特性空间中的k个最相似(既特性空间中最邻近)的样本中的大多数属于某一种类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经对的分类的对象。该措施在定类决策上只根据最邻近的一种或者几种样本的类别来决定待分样本所属的类别。KNN措施虽然从原理上也依赖于极限定理,但在类别决策時,只与很少許的相邻样本有关。由于KNN措施重要靠周围有限的邻近的样本,而不是靠鉴别类域的措施来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来說,KNN措施较其他措施更為适合。

KNN算法不仅可以用于分类,还可以用于回归。通过找出一种样本的k个近来邻居,将这些邻居的属性的平均值赋給该样本,就可以得到该样本的属性。更有用的措施是将不一样距离的邻居对该样本产生的影响予以不一样的权值(weight),如权值与距离成正比。

该算法在分类時有个重要的局限性是,当样本不平衡時,如一种类的样本容量很大,而其他类样本容量很小時,有也許导致当输入一种新样本時,该样本的K个邻居中大容量类的样本占多数。该算法只计算“近来的”邻居样本,某一类的样本数量很大,那么或者此类样本并不靠近目的样本,或者此类样本很靠近目的样本。无论怎样,数量并不能影响运行成果。可以采用权值的措施(和该样本距离小的邻居权值大)来改善。该措施的另一种局限性之处是计算量较大,由于对每一种待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个近来邻点。目前常用的处理措施是事先对已知样本点进行剪辑,事先清除对分类作用不大的样本。该算法比较合用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较轻易产生误分。

二试验环节

那么根据以上的描述,我把結合使用反余弦匹配和kNN結合的过程提成如下几种环节:

1.计算出样本数据和待分类数据的距离

2.為待分类数据选择k个与其距离最小的样本

3.记录出k个样本中大多数样本所属的分类

4.这个分类就是待分类数据所属的分类

数学体現:目的函数值可以是离散值(分类问題),也可以是持续值(回归问題).函数形势為f:n维空间R—〉一维空间R。

第一步:将数据集分為训练集(DTrn)和测试集(DTES)。

第二步:在测试集給定一种实例Xq;在训练集(DTrn)中找到与这个实例Xq的K-近来邻子集{X1、、、、XK},既:DKNN。

第三步:计算这K-近来邻子集得目的值,通过加权平均:^f(Xq)=(f(X1)+...+f(XK))/k作為f(Xq)的近似估计。改善的地方:对kNN算法的一种明显的改善是对k个近来邻的奉献加权,将较大的权值赋給较近的近邻,对应的算法称為距离加权kNN回归算法,则公式1则修改為:^f(Xq)=(w1*f(X1)+...+wk*f(XK))/(w1+...wk)一般地距离权值wi和距离成反比关系,例如,wi近似=1/d(xq;xi).K值的选择:需要消除K值过低,预测目的轻易产生变动性,同步高k值時,预测目的有过平滑現象。推定k值的有益途径是通过有效参数的数目这个概念。有效参数的数目是和k值有关的,大体等于n/k,其中,n是这个训练数据集中实例的数目。

缺陷:

(1)在大训练集寻找近来邻的時间是难以忍受的。

(2)在训练数据集中规定的观测值的数目,伴随维数p的增長以指数方式增長。这是由于和近来邻的期望距离伴随维数p的增多而急剧上升,除非训练数据集的大小伴随p以指数方式增長。这种現象被称為“维数劫难”。

处理措施有下面几种:

(1)通过降维技术来减少维数,如主成分分析,因子分析,变量选择(因子选择)从而减少计算距离的時间;

(2)用复杂的数据构造,如搜索树去加速近来邻确实定。这个措施常常通过公式2公式1设定“几乎是近来邻”的目的去提高搜索速度;

(3)编辑训练数据去减少在训练集中的冗余和几乎是冗余的点,从而加速搜索近来邻。在个别例子中去掉在训练数据集中的某些观测点,对分类效果没有影响,原因是这些点被包围属于同类的观测点中。

三注意事项

KNN算法的实現要注意:

1.用TreeMapString,TreeMapString,Double保留测试集和训练集。

2.注意要以类目_文献名作為每个文献的key,才能防止同名不一样内容的文献出現。

3.注意设置JM参数,否则会出現JAVAheap溢出錯误。

4.本程序用向量夹角余弦计算相似度。

四代码

//KNN.java

packagecqu.KNN;

importjava.util.ArrayList;

importjava.util.Comparator;

importj

显示全部
相似文档