机器学习导论作业
一.作业题目
用原生python实现KNN分类算法,采用鸢尾花数据集。
二.算法设计
2.1算法介绍:
KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。
KNN算法的思想非常简单:对于任意n维输入向量,分别对应于特征空间中的一个点,输出为该特征向量所对应的类别标签或预测值。
KNN算法是一种非常特别的机器学习算法,因为它没有一般意义上的学习过程。它的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的数据后,将这个没有标签的数据的每个特征与样本集中的数据对应的特征进行比较,然后提取样本中特征最相近的数据(最近邻)的分类标签。
一般而言,我们只选择样本数据集中前k个最相似的数据,这就是KNN算法中K的由来,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的类别,作为新数据的分类。
图1 KNN分类图
KNN算法的决策过程如下图2所示:
右图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
图2 KNN决策过程示意图
KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比。
2.2 算法流程:
准备数据,对数据进行预处理,下载对应的鸢尾花数据集。选用合适的数据结构存储训练数据和测试元组,本题中将测试集数据保存在Excel表格中。设定参数k,本程序中k取值为15三.有注释的源代码
具体实现代码如下所示:
①导入要用的模型及包
import numpy as np import pandas as pd import operator 123
②从文件中读取鸢尾花的数据集
def getData(): #读取自定义的文件,从中获得鸢尾花数据 f = open(r'C:UsersJCG1999Desktopiris.csv') iris=pd.read_csv(f) return iris 12345
③将鸢尾花的数据分开为测试集与训练集
def Classification(iris): #得到15个随机数,从中选取15个作为随机数 k=15 index=np.random.permutation(len(iris)) index=index[0:k] #将测试集弄出来 testSet=iris.take(index) #总的数据集减掉测试集就是训练集 trainingSet=iris.drop(index) sets=[testSet,trainingSet] #分成了测试集和训练集 print("数据集:n") print(trainingSet) print("测试集:n") print(testSet) return sets
12345678910111213141516④K-近邻具体代码
#trainingSet训练数据,testSet是测试数据 def knn(trainingSet,testSet,trainingResults): #numpy函数shape[0]返回dataSet的行数 totalsSize = trainingSet.shape[0] #将测试数据变成和训练数据一样的矩阵 tests = np.tile(testSet, (totalsSize, 1)) - trainingSet #二维特征相减后平方,注意上面的tile的用法,用于再创一个矩阵 # print(np.tile(testSet, (totalsSize, 1))) # print(trainingSet) # print(tests) sqDiffMat =(tests**2)**0.5 #sum()所有元素相加,sum(0)列相加,sum(1)行相加 sqDistances = sqDiffMat.sum(axis=1) #sum(axis=1)等于1是行的相加,axis=0是列的相加 #返回distances中元素从小到大排序后的索引值,即取距离近的 sortedDistIndices = sqDistances .argsort() #取出第一个元素的类别 voteIlabel = trainingResults[sortedDistIndices[1]] #返回第一个元素的类别 return voteIlabel iris=getData() sets=Classification(iris) #品种就是数据集中分类的那一列,这里得到了训练集的数据和训练集的真实品种 trainingSet=sets[1].drop(columns=['品种']).values trainingResults=sets[1]['品种'].values #测试集 testSets=sets[0].values #记录成功的次数 true=0 for i in testSets:#花萼的长宽、花瓣的长宽 testSet=[i[0],i[1],i[2],i[3]] ret=knn(trainingSet,testSet,trainingResults) #如果返回的答案和测试数据的答案一样sta+1 if ret==i[4]: true+=1 successRate=true/len(sets[0]) print('测试的成功率为:n',successRate)
123456789101112131415161718192021222324252627282930313233343536373839四.测试用例设计与调试过程截屏
1.运行程序,数据集显示如下:
…
2.测试集如下所示:
3.测试的成功率:
k=15
4.调试截图:
五.个人总结
通过此次实验练习,让我更加了解了knn算法的具体实现,对机器学习的有关内容有了更加深入了解。同时掌握了用python读取文件的基本方法,对今后的机器学习打下一定的基础。但是本次实验还存在些许不足,关于knn的测试数据准确性不是很高,需要优化代码来实现。希望在今后的学习中,能加强实践,优化学习,达到自己满意的水平。
参考资料:
https://blog.csdn.net/hajk2017/article/details/82862788
https://baike.baidu.com/item/%E9%82%BB%E8%BF%91%E7%AE%97%E6%B3%95/1151153?fr=aladdin
相关知识
【机器学习】KNN算法实现鸢尾花分类
KNN花卉识别项目练习
Knn算法实现鸢尾花分类
【机器学习】KNN算法实现手写板字迹识别
KNN算法实现鸢尾花数据集分类
KNN算法分类算法
Python原生代码实现KNN算法(鸢尾花数据集)
用python实现KNN算法对鸢尾花的分类
【机器学习】基于KNN算法实现鸢尾花数据集的分类
kNN 解决鸢尾花和手写数字识别分类问题
网址: knn https://m.huajiangbk.com/newsview854485.html
上一篇: 可视化=面子工程?浅谈企业可能走 |
下一篇: 项目过程记录 |