Python实现KNN(K-近邻)算法的示例代码
作者:Max_Lyu 发布时间:2023-09-25 15:56:18
一、概述
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
猜你喜欢
- 在Https页面中,如果iframe所引入页面是非https协议的页面,或者src属性不存在都可能导致浏览器弹出安全警告。本人在网上查找相关
- 学在前面从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写 5 篇左右的博客才可以完成,一起加油吧。本文的目标是
- 这篇文章主要介绍了Python实现序列化及csv文件读取,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 问题描述在电脑中重新安装Anaconda3&PyCharm后,运行原来的程序画图时出现了下图界面。不能弹出如下图所示的“figure”窗口。
- 前言当多线程访问同一个公共资源时,如果涉及到修改该公共资源的操作就可能会出现由于数据不同步导致的线程安全问题。一般情况下我们可以通过给公共资
- 创建多个交易各个客户进行的交易在系统中排队;矿工从这个队列中获取交易并将其添加到块中.然后他们将挖掘区块,获胜的矿工将有权将区块添加到区块链
- 本文实例讲述了Python Web框架之Django框架Model基础。分享给大家供大家参考,具体如下:model是关于你的数据的单一的,确
- 前言:在爬取并下载网页上的视频的时候,我们需要实时进度条,这可以帮助我们更直观的看到视频的下载进度。一、全部代码展示from context
- 如下所示:import collectionsclass Mydict(collections.UserDict):def __missin
- 前言保留小数位是我们经常会碰到的问题,尤其是刷题过程中。那么在python中保留小数位的方法也非常多,但是笔者的原则就是什么简单用什么,因此
- Gradio 是做什么的?先决条件:Gradio 需要 Python 3.7 或更高版本,仅此而已!gradio.app/quickstar
- yaml简介1.yaml [ˈjæməl]: Yet Another Markup Language :另一种标记语言。
- 常用的重定向方式有: 301 redirect, 302 redirect 与 meta fresh:301 redirect: 301代表
- 本文介绍基于Python语言arcpy模块,实现栅格影像图层建立与多幅遥感影像数据批量拼接(Mosaic)的操作。首先,相关操作所需具体代码
- 很多人都听过WAMP这个词吧,首先来看WAMP是什么意思?Windows下的Apache+MySQL+PHP,称为WAMP。属于WAMP环境
- 可能很多人遇到过这个错误,当使用setup.py安装python2.7图像处理模块PIL时,python默认会寻找电脑上以安装的vs2008
- QZONE平台的相册功能为保证加载速度一直以来以简洁的图片排列查看模式呈现相片,随着市场上各类相册产品推陈出新,用户越来越强烈的要求个人相册
- 打开php.ini,首先找到;;;;;;;;;;;;;;;;; file uploads ;;;;;;;;;;;;;;;;;区域,有影响文件
- 简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增。最新的代码可以访问从githu
- html页面一般都会指定一个编码,如何获取到是处理html页面的第一步,因为错误的编码必然带来后面处理的问题。这里我用python的正则表达