1.概念:

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属的类别,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

2.算法流程

1. 准备数据,对数据进行预处理
2. 选用合适的数据结构存储训练数据和测试元组
3. 设定参数,如k
4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列
5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L 与优先级队列中的最大距离Lmax
6. 进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L < Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队列。
7. 遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别。
8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。

3.算法在python3中的实现

import  csv
import  math
import  random
import  operator
def Load_dataset(file_path,split,TesttrainingSet=[],TestSet = []):"""  加载数据,并将数据按比例分成训练集和测试集:param file_path:  文件路径:param split:  训练和测试的百分比:param TesttrainingSet: 训练列表集合:param TestSet:  测试列表集合:return:"""with open(file_path) as  csvfile:lines = csv.reader(csvfile)dataset = list(lines)#print(dataset)for x in range(len(dataset)-1):  #遍历所有数据for y in range(4)  :#将所有行的数据转化成浮点数dataset[x][y] = float(dataset[x][y])if random.random()<split: #按比例把数据分成训练集和测试集合TesttrainingSet.append(dataset[x])else :TestSet.append(dataset[x])def Caculate_distance(Instance1,Instance2,length):""" 计算样本的距离:param Instance1:样本1 (列表):param Instance2: 样本2(列表):param length: 样本的维度:return: 样本之间的距离"""for i in range(length):distance = math.pow((Instance1[i]-Instance2[i]),2)distance =math.sqrt(distance)return distance
def Get_negibors(Trainingset,TestInstance,K):""" 获得最近距离的K个邻居:param Trainingset: 训练样本集合:param TestInstance: 中心样本点:param K:  获得的邻居的个数:return: 邻近样本的集合"""Distance_list = [] #存储距离Neighbor =[] #存储K个紧邻样本length = len(TestInstance)-1 #获得样本的维度for x in range(len(Trainingset)): #遍历所有的训练集,求距离dis = Caculate_distance(Trainingset[x],TestInstance,length)Distance_list.append((Trainingset[x],dis))   #将对应的距离元组的形式存储到列表中Distance_list.sort(key = operator.itemgetter(1))  #对距离排序for i in range(K):Neighbor.append(Distance_list[i][0]) #将近邻的点存储到Neighbor列表中#  print(Distance_list[i])#print(Neighbor)return Neighbor
def Get_Response(Neighbor):""" 根据多数原则,从邻近的集合中确定样本类型:param Neighbor::return: 样本所属类型"""classVotes = {}  #字典,用来存储每一种邻居的个数for x in range(len(Neighbor)):response = Neighbor[x][-1]if response in classVotes:classVotes[response] +=1else:classVotes[response]=1sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)  #对字典排序后会变成列表+元组的形式存储#print(sortedVotes)return sortedVotes[0][0]
def Accurancy_judge(Test_data,Prediction):""" 判断预测是否正确:param Test_data: 原测试样本:param Prediction: 预测结果:return: 1(正确) 0(错误)"""flag = 0if Test_data[-1] ==Prediction:flag =1else:flag =0return flag
def main():TesttrainingSet = []TestSet = []Predict_list = []Load_dataset('F:/python学习/KNN算法/irisdata.txt',0.7,TesttrainingSet,TestSet)# print(TestSet)# print(TesttrainingSet)total = len(TestSet)count =0for i in range(len (TestSet)):#遍历所有要测试的样本Neighbors = Get_negibors(TesttrainingSet,TestSet[i],9)#获取样本的邻近点的集合predict = Get_Response(Neighbors)#预测Predict_list.append(predict)count +=Accurancy_judge(TestSet[i],predict)print(predict+'\n'+TestSet[i][-19])  #输出实际值和预测值print("预测的正确率为 %f" %((count/total)*100)+"%")#计算并输出邻近算法的正确率if __name__ == '__main__':main()

机器学习之临近算法(KNN)相关推荐

  1. 临近算法knn(k-nearest neighbor)的计算

    想想还是把最近学的东西(AI机器学习)做一个分享吧,毕竟对知识的理解可能有错但按时成长是没有错的,本人对这些知识的认识比较粗浅还望大家多多包涵. 从零开始机器学习 第一章: 临近算法knn(k-nea ...

  2. 【机器学习】最近邻算法KNN原理、流程框图、代码实现及优缺点

    通过机器学习教学视频,初识KNN算法,对原理和算法流程通过小应用进行Python实现,有了自己的一些理解.因此在此整理一下,既是对自己学习的阶段性总结,也希望能和更多的朋友们共同交流学习相关算法,如有 ...

  3. 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别

    机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...

  4. 教你用OpenCV实现机器学习最简单的k-NN算法

    前言:OpenCV 的构建是为了提供计算机视觉的通用基础接口,现在已经成为经典和最优秀的计算机视觉和机器学习的综合算法工具集.作为一个开源项目,研究者.商业用户和政府部门都可以轻松利用和修改现成的代码 ...

  5. Python 机器学习大作业 用knn算法对adult数据集进行50w年薪收入预测

    数据分析与机器学习--收入分类 摘 要 今天,人工智能AI已经融入了人类的生活,基本上在生活中能接触到的领域,都有人工智能的身影.而说起人工智能就必定会想到机器学习ML,它以某种方式几乎影响了每个行业 ...

  6. KNN算法(K临近算法)及使用KNN算法实现手写数字0-9识别

    首先感谢博主倔强的小彬雅,本文使用的素材及部分代码来源其博文机器学习入门-用KNN实现手写数字图片识别(包含自己图片转化),需要下载素材的可以到其博文最后进行下载. 关于KNN算法 knn算法也叫K临 ...

  7. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. 用Python开始机器学习(4:KNN分类算法)

    转自: http://blog.csdn.net/lsldd/article/details/41357931 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classi ...

  9. 手把手教你用OpenCV实现机器学习最简单的k-NN算法(附代码)

    导读:OpenCV 的构建是为了提供计算机视觉的通用基础接口,现在已经成为经典和最优秀的计算机视觉和机器学习的综合算法工具集.作为一个开源项目,研究者.商业用户和政府部门都可以轻松利用和修改现成的代码 ...

最新文章

  1. linux系统硬盘数据恢复软件下载,Linux硬盘数据恢复软件
  2. Java 调用 Kotlin
  3. 【转载】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
  4. leetcode BFS(python+c++)
  5. 上海大学计算机组成原理实验13,上海大学计算机组成原理实验报告11.doc
  6. python万年历_python万年历
  7. Inno Setup脚本
  8. java画图工具_java画图板工具
  9. ldoce6 android,少儿英语学习词典 朗文当代LDOCE6双解词典
  10. 常用的公共数据集(一)
  11. Go语言实现企业微信sdk,集成了第三方应用sdk和自建应用代开发的sdk,支持一键生成新sdk
  12. mysql 备份库的shell_shell脚本之 备份mysql数据库
  13. so easy! 10行代码写个狗屁不通文章生成器
  14. qgis面图层周长面积计算(视频)
  15. win7 设置双屏壁纸
  16. 工业设计中的色彩应用标准及配色方法
  17. TCP应用层主要协议
  18. Redis-狂神笔记-菜鸟风闲整理
  19. HDS CTO谈优化存储投资 渡过经济寒冬
  20. 用python解决数据结构与算法_python中各种数据结构与算法的解决技巧

热门文章

  1. Vue.js入门指南(一)
  2. 分享几个好看的Bootstrap后台管理响应式模板
  3. python求梯形面积_pythonocc 求一条直线与一个梯形的交点的横坐标
  4. Solaris 10 Configure IPMP
  5. java实现未读消息提醒_JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】...
  6. 操盘手曝光神秘庄家下单要诀
  7. 说好的牛市来了,我的股票怎么跌停了?
  8. ntopng安装和基本使用教程
  9. Hadoop综合试题5
  10. 从 Hadoop 到云原生:Kyligence 在云原生巨浪中的思考(1)