knn算法详细步骤(Python实现KNNK-近邻算法的示例代码)
knn算法详细步骤
Python实现KNNK-近邻算法的示例代码一、概述
knn(k-最近邻)算法是相对比较简单的机器学习算法之一,它主要用于对事物进行分类。用比较官方的话来说就是:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例, 这k个实例的多数属于某个类,就把该输入实例分类到这个类中。为了更好地理解,通过一个简单的例子说明。
我们有一组自拟的关于电影中镜头的数据:
那么问题来了,如果有一部电影 x,它的打戏为 3,吻戏为 2。那么这部电影应该属于哪一类?
我们把所有数据通过图表显示出来(圆点代表的是自拟的数据,也称训练集;三角形代表的是 x 电影的数据,称为测试数据):
计算测试数据到训练数据之间的距离,假设 k 为 3,那么我们就找到距离中最小的三个点,假如 3 个点中有 2 个属于动作片,1 个属于爱情片,那么把该电影 x 分类为动作片。这种通过计算距离总结 k 个最邻近的类,按照”少数服从多数“原则分类的算法就为 knn(k-近邻)算法。
二、算法介绍
还是以上面的数据为例,打戏数为 x,吻戏数为 y,通过欧式距离公式计算测试数据到训练数据的距离,我上中学那会儿不知道这个叫做欧式距离公式,一直用”两点间的距离公式“来称呼这个公式: 。但是现实中的很多数据都是多维的,即使如此,也还是按照这个思路进行计算,比如如果是三维的话,就在根号里面再加上 z 轴差的平方,即 ,以此类推。
知道了这个计算公式,就可以计算各个距离了。我们以到最上面的点的距离为例: ,那么从上到下的距离分别是: , , , 。现在我们把 k 定为 3,那么距离最近的就是后面三个数了,在这三个数中,有两个属于动作片,因此,电影 x 就分类为动作片。
三、算法实现
知道了原理,那就可以用代码实现了,这里就不再赘述了,直接上带注释的 python 代码:
|
''' traindata - 训练集 testdata - 测试集 labels - 分类 ''' def knn(traindata, testdata, labels, k): # 计算训练样本的行数 rowsize = traindata.shape[ 0 ] # 计算训练样本和测试样本的差值 diff = np.tile(testdata, (rowsize, 1 )) - traindata # 计算差值的平方和 sqrdiff = diff * * 2 sqrdiffsum = sqrdiff. sum (axis = 1 ) # 计算距离 distances = sqrdiffsum * * 0.5 # 对所得的距离从低到高进行排序 sortdistance = distances.argsort() count = {} for i in range (k): vote = labels[sortdistance[i]] count[vote] = count.get(vote, 0 ) + 1 # 对类别出现的频数从高到低进行排序 sortcount = sorted (count.items(), key = operator.itemgetter( 1 ), reverse = true) # 返回出现频数最高的类别 return sortcount[ 0 ][ 0 ] |
ps:np.tile(testdata, (rowsize, 1)) 是将 testdata 这个数据扩展为 rowsize 列,这样能避免运算错误;
sorted(count.items(), key=operator.itemgetter(1), reverse=true) 排序函数,里面的参数 key=operator.itemgetter(1), reverse=true 表示按照 count 这个字典的值(value)从高到低排序,如果把 1 换成 0,则是按字典的键(key)从高到低排序。把 true 换成 false 则是从低到高排序。
四、测试与总结
用 python 实现了算法之后,我们用上面的数据进行测试,看一下结果是否和我们预测的一样为动作片:
|
traindata = np.array([[ 5 , 1 ], [ 4 , 0 ], [ 1 , 3 ], [ 0 , 4 ]]) labels = [ '动作片' , '动作片' , '爱情片' , '爱情片' ] testdata = [ 3 , 2 ] x = knn(traindata, testdata, labels, 3 ) print (x) |
执行这段代码后输出的结果为:动作片 。和预测的一样。当然通过这个算法分类的正确率不可能为 100%,可以通过增加修改数据测试,如果有大量多维的数据就更好了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:http://www.cnblogs.com/lyuzt/p/10471617.html
- python学生管理系统与数据库(python学生管理系统学习笔记)
- python操作json库(Python将json文件写入ES数据库的方法)
- 使用python爬取网易云音乐(15行Python代码实现网易云热门歌单实例教程)
- pythonpick教程(Python使用Pickle模块进行数据保存和读取的讲解)
- python爬虫怎么爬取vip资源(Python网络爬虫之爬取微博热搜)
- 在python中如何删除指定的行(Python删除n行后的其他行方法)
- python装饰器初学者教程(Python3.5装饰器原理及应用实例详解)
- python语言中的递归(详解python中递归函数)
- python函数大全详细(详解Python函数式编程—高阶函数)
- python交互模式下如何开始运行(python交互界面的退出方法)
- python代码添加微信号(python 获取微信好友列表的方法微信web)
- python try高级用法(python try 异常处理史上最全)
- python 文本文件读取方法(Python逐行读取文件中内容的简单方法)
- 基于python的加密算法(python实现维吉尼亚加密法)
- pythonqt入门教程(使用python实现mqtt的发布和订阅)
- python验证码处理教程(python简单验证码识别的实现方法)
- 银泰集团董事长沈国军获评 北京影响力 十大企业家(银泰集团董事长沈国军获评)
- 15帅气男士发型,清爽时尚很有型,喜欢就试试(清爽时尚很有型)
- 哪几个历史人物被影协主席李雪健演的活灵活现(哪几个历史人物被影协主席李雪健演的活灵活现)
- 王伦狭隘,晁盖霸道,宋江奸诈骨头软,只有鲁智深才适合当寨主(王伦狭隘晁盖霸道)
- 他是梁山最早的头目,江湖人称 旱地忽律 ,宋江几乎将其遗忘(他是梁山最早的头目)
- 梁山创始人杜迁,为何不受宋江待见,只排名83位(梁山创始人杜迁)
热门推荐
- 一个网站服务器有多大(主流网站服务器配置有哪些组成 主流网站服务器多少钱)
- 进程和线程的区别有哪些
- pip默认镜像怎么设置(将pip源更换到国内镜像的详细步骤)
- 阿里云服务器搭建linux学习环境(Mac 下阿里云服务器的配置方法)
- 云服务器和物理服务器哪个可靠(云服务器与香港服务器有什么区别?)
- 阿里云centos7java服务器搭建(阿里云 ubuntu16.04搭建IPSec服务)
- centos7 离线安装nginx(centos8安装nginx1.9.1的详细过程)
- mysql显示所有数据库语句(MySQL数据库自动补全命令的三种方法)
- 生成随机数javascript(JavaScript实现随机生成验证码及校验)
- idea中tomcat快速部署(IDEA编辑器整合Apache Tomcat的详细教程)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9