Python实现KNN(K-近邻)算法的示例代码

作者:Max_Lyu 时间:2023-09-25 15:56:18 

一、概述

KNN(K-最近邻)算法是相对比较简单的机器学习算法之一,它主要用于对事物进行分类。用比较官方的话来说就是:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例, 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。为了更好地理解,通过一个简单的例子说明。

我们有一组自拟的关于电影中镜头的数据:

Python实现KNN(K-近邻)算法的示例代码

那么问题来了,如果有一部电影 X,它的打戏为 3,吻戏为 2。那么这部电影应该属于哪一类?

我们把所有数据通过图表显示出来(圆点代表的是自拟的数据,也称训练集;三角形代表的是 X 电影的数据,称为测试数据):

Python实现KNN(K-近邻)算法的示例代码

计算测试数据到训练数据之间的距离,假设 k 为 3,那么我们就找到距离中最小的三个点,假如 3 个点中有 2 个属于动作片,1 个属于爱情片,那么把该电影 X 分类为动作片。这种通过计算距离总结 k 个最邻近的类,按照”少数服从多数“原则分类的算法就为 KNN(K-近邻)算法。

二、算法介绍

还是以上面的数据为例,打戏数为 x,吻戏数为 y,通过欧式距离公式计算测试数据到训练数据的距离,我上中学那会儿不知道这个叫做欧式距离公式,一直用”两点间的距离公式“来称呼这个公式: Python实现KNN(K-近邻)算法的示例代码 。但是现实中的很多数据都是多维的,即使如此,也还是按照这个思路进行计算,比如如果是三维的话,就在根号里面再加上 z 轴差的平方,即  Python实现KNN(K-近邻)算法的示例代码 ,以此类推。

知道了这个计算公式,就可以计算各个距离了。我们以到最上面的点的距离为例: Python实现KNN(K-近邻)算法的示例代码 ,那么从上到下的距离分别是: Python实现KNN(K-近邻)算法的示例代码Python实现KNN(K-近邻)算法的示例代码Python实现KNN(K-近邻)算法的示例代码Python实现KNN(K-近邻)算法的示例代码 。现在我们把 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,K近邻算法
0
投稿

猜你喜欢

  • python 地图经纬度转换、纠偏的实例代码

    2021-11-06 11:12:18
  • python使用自定义user-agent抓取网页的方法

    2021-12-27 03:09:56
  • Python数据存储之XML文档和字典的互转

    2023-02-12 08:56:11
  • 也谈网页圆角的背景图法

    2009-03-19 14:09:00
  • 轻松解决AJAX的中文乱码问题

    2008-09-03 12:55:00
  • sql中count或sum为条件的查询示例(sql查询count)

    2024-01-16 04:05:02
  • Pycharm没有报错提示(误触ignore)的完美解决方案

    2023-01-24 13:39:34
  • css+js实现部分区域高亮可编辑遮罩层

    2024-02-25 08:49:23
  • 快速查找Python安装路径方法

    2023-02-24 00:11:23
  • vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)

    2024-05-22 10:28:19
  • Python爬虫 bilibili视频弹幕提取过程详解

    2023-07-05 06:41:25
  • PDO::_construct讲解

    2023-06-06 03:22:31
  • 基于Node.js实现nodemailer邮件发送

    2024-05-03 15:36:40
  • ASP申请单动态添加实现方法及代码

    2008-11-04 11:09:00
  • 获取星期几的名称

    2012-01-29 18:16:31
  • Python的条件语句与运算符优先级详解

    2023-06-21 07:43:49
  • 也谈javascript程序优化问题

    2008-10-29 11:30:00
  • asp OpenTextFile文本读取与写入实例代码

    2011-04-15 11:00:00
  • SQL数据类型详解

    2024-01-13 02:01:30
  • F.conv2d pytorch卷积计算方式

    2021-06-26 07:38:41
  • asp之家 网络编程 m.aspxhome.com