合工大-人工智能原理实验报告

目录

人工智能原理实验报告

源码下载地址 


人工智能原理实验报告

实验报告是关于实验教学内容、过程及效果的记录和总结,因此,应注意以下事项和要求:

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时

合工大-人工智能原理实验报告_第1张图片

七、实验结果分析

要求:请通过实验结果分析是否已完成实验要求、正确得到预计的实验结果。可分析所采用算法的实际性能以及后续改进空间。以及给出实验过程中遇到的问题及解决方案。鼓励学有余力的同学通过实验结果分析不同算法的性能对比。

根据我们的实验结果,已经可以分别测试集的的类别,准确率达到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))

  1. 感想、体会、建议∶

  

希望以后可以在编程的路上越走越远。

上机报告成绩评语

指导教师签名:

年    月   日

源码下载地址 

https://gitee.com/yishangyishang/HFUT_Artificial_Intelligence_Experiment_Report.git

你可能感兴趣的:(人工智能,人工智能,python,hfut,合工大)