人工智能原理实验报告
实验报告是关于实验教学内容、过程及效果的记录和总结,因此,应注意以下事项和要求:
1.实验报告要求:格式规范,语言表达清楚,数据和程序真实。并能够理论联系实际,认真分析实验中出现的问题与现象,总结经验。
2.实验报告的撰写应独立完成,严禁抄袭或拷贝,否则,一经查实,按作弊论取,并取消理论课考试资格。
3. 可根据实际需要调整每个单元格的篇幅。
4. 请按照要求填写实验报告。算法源代码请放置在附录中。
题目序号_1___ 作业名称: 基于knn算法
实验时间∶ 2022 年 10月 29 日
实验内容 |
一、题目内容和要求: 使用提供的几种算法训练分类器 |
Knn介绍 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。 实验数据介绍 实验数据为老师提供的数据,这里使用 diabetes_discrete.data 这个数据集 分类模型介绍 分类模型使用knn模型 |
三、解题思路 将数据集分为测试集和训练集。向训练好的模型输入测试集的内容,将得到的结果与真实情况对比,最后检测得到模型的准确率为70%左右 |
四、算法伪代码 数据预处理: # 数据预处理 group=[] label=[] for i in range(len(data)): temp=[] for j in range(len(data[0])): if data[i][j]>=0: temp.append(int(data[i][j])) label.append(temp[-1]) group.append(temp[:-1]) test=group group=np.array(group) Knn分类 def classify0(inX, dataSet, labels, k): #numpy函数shape[0]返回dataSet的行数 dataSetSize = dataSet.shape[0] #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向) diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet #二维特征相减后平方 sqDiffMat = diffMat**2 #sum()所有元素相加,sum(0)列相加,sum(1)行相加 sqDistances = sqDiffMat.sum(axis=1) #开方,计算出距离 distances = sqDistances**0.5 #返回distances中元素从小到大排序后的索引值 sortedDistIndices = distances.argsort() #定一个记录类别次数的字典 classCount = {} for i in range(k): #取出前k个元素的类别 voteIlabel = labels[sortedDistIndices[i]] #dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。 #计算类别次数 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #python3中用items()替换python2中的iteritems() #key=operator.itemgetter(1)根据字典的值进行排序 #key=operator.itemgetter(0)根据字典的键进行排序 #reverse降序排序字典 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #返回次数最多的类别,即所要分类的类别 return sortedClassCount[0][0] |
五、实验设置 实验工具: Pycharm,python 实验配置: windows系统 |
六、实验结果 要求: (1)请以表格或图片的方式给出实验结果。 (2)图片、表格应符合规范:应有标题、并分别编号。 (3)结果内容可包括:测试用例、预计输出结果、实际输出结果、运行时间对比等。鼓励学有余力的同学提供与其他算法的实验结果对比。 当训练集为1:500 测试集为501:768,k=5时 |
七、实验结果分析 要求:请通过实验结果分析是否已完成实验要求、正确得到预计的实验结果。可分析所采用算法的实际性能以及后续改进空间。以及给出实验过程中遇到的问题及解决方案。鼓励学有余力的同学通过实验结果分析不同算法的性能对比。 根据我们的实验结果,已经可以分别测试集的的类别,准确率达到70%,我们看到训练集的大小和k的取值不同对最后的结果有影响,但在本次实验中影响并不大 |
八、总结 通过此次实验,学习到了knn算法,对该算法的原理有了更深入的了解,而且通过这个算法训练了模型,准确率在70%以上,希望以后可以在编程的路上越走越远。 |
九、附录:算法源代码(要求:小五号字体、行距12磅) # -*- coding: UTF-8 -*- import operator import numpy as np import pandas as pd data = pd.read_csv('课程报告数据集/diabetes_discrete.data', sep=' ', names=[i for i in range(590)]) data = np.array(data) """ group - 数据集 labels - 分类标签 """ # 数据预处理 group=[] label=[] for i in range(len(data)): temp=[] for j in range(len(data[0])): if data[i][j]>=0: temp.append(int(data[i][j])) label.append(temp[-1]) group.append(temp[:-1]) test=group group=np.array(group) """ 函数说明:kNN算法,分类器 Parameters: inX - 用于分类的数据(测试集) dataSet - 用于训练的数据(训练集) labes - 分类标签 k - kNN算法参数,选择距离最小的k个点 Returns: sortedClassCount[0][0] - 分类结果 Modify: 2017-07-13 """ def classify0(inX, dataSet, labels, k): #numpy函数shape[0]返回dataSet的行数 dataSetSize = dataSet.shape[0] #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向) diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet #二维特征相减后平方 sqDiffMat = diffMat**2 #sum()所有元素相加,sum(0)列相加,sum(1)行相加 sqDistances = sqDiffMat.sum(axis=1) #开方,计算出距离 distances = sqDistances**0.5 #返回distances中元素从小到大排序后的索引值 sortedDistIndices = distances.argsort() #定一个记录类别次数的字典 classCount = {} for i in range(k): #取出前k个元素的类别 voteIlabel = labels[sortedDistIndices[i]] #dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。 #计算类别次数 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #python3中用items()替换python2中的iteritems() #key=operator.itemgetter(1)根据字典的值进行排序 #key=operator.itemgetter(0)根据字典的键进行排序 #reverse降序排序字典 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #返回次数最多的类别,即所要分类的类别 return sortedClassCount[0][0] # 训练集大小 l=500 #训练数据集 group, labels = group[0:l],label[0:l] #测试集 group_test=test[l:] label_test=label[l:] #kNN分类 cnt=0 for i in range(len(group_test)): test_class = classify0(group_test[i], group, labels, 5) if test_class==label_test[i]: cnt+=1 # 输出 print(cnt/len(group_test)) |
希望以后可以在编程的路上越走越远。 |
上机报告成绩、评语∶ 指导教师签名: 年 月 日 |