ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:19.14KB ,
资源ID:8208634      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8208634.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(完整版KNN算法实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

完整版KNN算法实验报告.docx

1、完整版KNN算法实验报告 KNN算法实验报告一 试验原理K最近邻(k-NearestNeighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的

2、,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比。该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论

3、怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。二 试验步骤那么根据以上的描述,我把结合使用反余弦匹配和kNN结合的过程分成以下几个步骤:1计算出样本数据和待分类数据的距离2为待分类数据选择k个与其距离最小的样本3统计出k个样本中大多数样本所属的分类4这个分类就是待

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(

5、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以指数方式增长。这种现象被称为“维数灾难”。解决办法有

6、下面几个:(1)通过降维技术来减少维数,如主成分分析,因子分析,变量选择(因子选择)从而减少计算距离的时间;(2)用复杂的数据结构,如搜索树去加速最近邻的确定。这个方法经常通过公式2公式1设定“几乎是最近邻”的目标去提高搜索速度;(3)编辑训练数据去减少在训练集中的冗余和几乎是冗余的点,从而加速搜索最近邻。在个别例子中去掉在训练数据集中的一些观察点,对分类效果没有影响,原因是这些点被包围属于同类的观测点中。三 注意事项KNN算法的实现要注意:1用TreeMapString,TreeMap保存测试集和训练集。2注意要以类目_文件名作为每个文件的key,才能避免同名不同内容的文件出现。3注意设置J

7、M参数,否则会出现JAVAheap溢出错误。4本程序用向量夹角余弦计算相似度。四 代码/KNN.javapackage cqu.KNN;import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map;import java.util.PriorityQueue; /KNN算法主体类 public class KNN /* * 设置优先级队列的比较函数,距离越大,优先级越高 */ private Compar

8、ator comparator = new Comparator() public int compare(KNNNode o1, KNNNode o2) if (o1.getDistance() = o2.getDistance() return -1; else return 1; ; /* * 获取K个不同的随机数 * param k 随机数的个数 * param max 随机数最大的范围 * return 生成的随机数数组 */ public List getRandKNum(int k, int max) List rand = new ArrayList(k); for (int

9、i = 0; i k; i+) int temp = (int) (Math.random() * max); if (!rand.contains(temp) rand.add(temp); else i-; return rand; /* * 计算测试元组与训练元组之前的距离 * param d1 测试元组* param d2 训练元组 * return 距离值 */ public double calDistance(List d1, List d2) double distance = 0.00; for (int i = 0; i d1.size(); i+) distance +=

10、 (d1.get(i) - d2.get(i) * (d1.get(i) - d2.get(i); return distance; /* * 执行KNN算法,获取测试元组的类别 * param datas 训练数据集 * param testData 测试元组 * param k 设定的K值 * return 测试元组的类别 */ public String knn(ListList datas, List testData, int k) PriorityQueue pq = new PriorityQueue(k,comparator); List randNum = getRandKN

11、um(k, datas.size(); for (int i = 0; i k; i+) int index = randNum.get(i); List currData = datas.get(index); String c = currData.get(currData.size()-1).toString(); KNNNode node = new KNNNode(index, calDistance(testData, currData), c); pq.add(node); for (int i = 0; i datas.size(); i+) List t = datas.ge

12、t(i); double distance = calDistance(testData, t); KNNNode top = pq.peek(); if (top.getDistance() distance) pq.remove(); pq.add(new KNNNode(i, distance, t.get(t.size()-1).toString(); return getMostClass(pq); /* * 获取所得到的k个最近邻元组的多数类 * param pq 存储k个最近近邻元组的优先级队列* return 多数类的名称 */ private String getMostCl

13、ass(PriorityQueue pq) Map classCount = new HashMap(); int pqsize = pq.size(); for (int i = 0; i pqsize; i+) KNNNode node = pq.remove(); String c = node.getC(); if (classCount.containsKey(c) classCount.put(c, classCount.get(c) + 1); else classCount.put(c, 1); int maxIndex = -1; int maxCount = 0; Obje

14、ct classes = classCount.keySet().toArray(); for (int i = 0; i maxCount) maxIndex = i; maxCount = classCount.get(classesi); return classesmaxIndex.toString(); /KNNNode.javapackage cqu.KNN;public class KNNNode private int index; / 元组标号 private double distance; / 与测试元组的距离 private String c; / 所属类别 publi

15、c KNNNode(int index, double distance, String c) super(); this.index = index; this.distance = distance; this.c = c; public int getIndex() return index; public void setIndex(int index) this.index = index; public double getDistance() return distance; public void setDistance(double distance) this.distan

16、ce = distance; public String getC() return c; public void setC(String c) this.c = c; /TestKNN.javapackage cqu.KNN;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.util.ArrayList;import java.util.List; / KNN算法测试类 public class TestKNN /* * 从数据文件中读取数据 * param data

17、s 存储数据的集合对象 * param path 数据文件的路径 */ public void read(ListList datas, String path) try BufferedReader br = new BufferedReader(new FileReader(new File(path); String reader = br.readLine(); while (reader != null) String t = reader.split( ); ArrayList list = new ArrayList(); for (int i = 0; i t.length;

18、i+) list.add(Double.parseDouble(ti); datas.add(list); reader = br.readLine(); catch (Exception e) e.printStackTrace(); /* * 程序执行入口 * param args */ public static void main(String args) TestKNN t = new TestKNN(); String datafile = new File().getAbsolutePath() + File.separator + cqudatadatafile.txt; St

19、ring testfile = new File().getAbsolutePath() + File.separator + cqudatatestfile.txt; try ListList datas = new ArrayListList(); ListList testDatas = new ArrayListList(); t.read(datas, datafile); t.read(testDatas, testfile); KNN knn = new KNN(); for (int i = 0; i testDatas.size(); i+) List test = test

20、Datas.get(i); System.out.print(测试元组: ); for (int j = 0; j test.size(); j+) System.out.print(test.get(j) + ); System.out.print(类别为: ); System.out.println(Math.round(Float.parseFloat(knn.knn(datas, test, 3); catch (Exception e) e.printStackTrace(); 五 运行测试训练数据: 1.0 1.1 1.2 2.1 0.3 2.3 1.4 0.5 1 1.7 1.2

21、 1.4 2.0 0.2 2.5 1.2 0.8 1 1.2 1.8 1.6 2.5 0.1 2.2 1.8 0.2 1 1.9 2.1 6.2 1.1 0.9 3.3 2.4 5.5 01.0 0.8 1.6 2.1 0.2 2.3 1.6 0.5 1 1.6 2.1 5.2 1.1 0.8 3.6 2.4 4.5 0 实验数据: 1.0 1.1 1.2 2.1 0.3 2.3 1.4 0.51.7 1.2 1.4 2.0 0.2 2.5 1.2 0.81.2 1.8 1.6 2.5 0.1 2.2 1.8 0.2 1.9 2.1 6.2 1.1 0.9 3.3 2.4 5.51.0 0.8

22、 1.6 2.1 0.2 2.3 1.6 0.5 1.6 2.1 5.2 1.1 0.8 3.6 2.4 4.5 程序运行结果: 测试元组: 1.0 1.1 1.2 2.1 0.3 2.3 1.4 0.5 类别为: 1 测试元组: 1.7 1.2 1.4 2.0 0.2 2.5 1.2 0.8 类别为: 1 测试元组: 1.2 1.8 1.6 2.5 0.1 2.2 1.8 0.2 类别为: 1 测试元组: 1.9 2.1 6.2 1.1 0.9 3.3 2.4 5.5 类别为: 0 测试元组: 1.0 0.8 1.6 2.1 0.2 2.3 1.6 0.5 类别为: 1 测试元组: 1.6 2.1 5.2 1.1 0.8 3.6 2.4 4.5 类别为: 0

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1