目录
人工智能原理实验报告实验报告是关于实验教学内容、过程及效果的记录和总结,因此,应注意以下事项和要求:
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))
感想、体会、建议∶
希望以后可以在编程的路上越走越远。
上机报告成绩、评语∶
指导教师签名:
年 月 日
https://gitee.com/yishangyishang/HFUT_Artificial_Intelligence_Experiment_Report.git