ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

k-近邻算法的Python实现

2022-02-27 22:30:40  阅读:183  来源: 互联网

标签:dist 爱情片 Python 近邻 电影 算法 类别


k-近邻算法的Python实现

一、概述

k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法,是数据挖掘技术中原理最简单的算法。KNN的工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最近的k个点来投票决定X归为哪一类。

在这里插入图片描述

图1中有红色三角和蓝色方块两种类别,我们现在需要判断绿色圆点属于哪种类别

当k=3时,绿色圆点属于红色三角这种类别;

当k=5时,绿色圆点属于蓝色方块这种类别。

举个简单的例子,可以用k-近邻算法分类一个电影是爱情片还是动作片。(打斗镜头和接吻镜头数量为虚构)

在这里插入图片描述

在这里插入图片描述

我们可以从散点图中大致推断,这个未知电影有可能是爱情片,因为看起来距离已知的三个爱情片更近一点。k-近邻算法是用什么方法进行判断呢?没错,就是距离度量。这个电影分类例子中有两个特征,也就是在二维平面中计算两点之间的距离,就可以用我们高中学过的距离计算公式:
在这里插入图片描述

如果是多个特征扩展到N维空间,怎么计算?没错,我们可以使用欧氏距离(也称欧几里得度量),如下所示

在这里插入图片描述

通过计算可以得到训练集中所有电影与未知电影的距离,如表2所示

在这里插入图片描述

通过表2的计算结果,我们可以知道绿点标记的电影到爱情片《后来的我们》距离最近,为29.1。如果仅仅根据这个结果,判定绿点电影的类别为爱情片,这个算法叫做最近邻算法,而非k-近邻算法。k-近邻算法步骤如下:

(1)计算已知类别数据集中的点与当前点之间的距离;

(2)按照距离递增次序排序;

(3)选取与当前点距离最小的k个点;

(4)确定前k个点所在类别的出现频率;

(5)返回前k个点出现频率最高的类别作为当前点的预测类别。

比如,现在K=4,那么在这个电影例子中,把距离按照升序排列,距离绿点电影最近的前4个的电影分别是《后来的我们》、《前任3》、《无问西东》和《红海行动》,这四部电影的类别统计为爱情片:动作片=3:1,出现频率最高的类别为爱情片,所以在k=4时,绿点电影的类别为爱情片。这个判别过程就是k-近邻算法。

二、k-近邻算法的Python实现

在了解k-近邻算法的原理及实施步骤之后,我们用python将这些过程实现。

1.1构建已经分类好的原始数据集为了方便验证,这里使用python的字典dict构建数据集,然后再将其转化成DataFrame格式。

import pandas as pd

rowdata = {'电影名称': ['无问东西', '后来的我们', '前任3', '红海行动', '唐人街探案', '战狼'],
           '打斗镜头': [1, 5, 12, 108, 112, 115],
           '接吻镜头': [101, 89, 97, 5, 9, 8],
           '电影类型': ['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片']}
movie_data = pd.DataFrame(rowdata)
print(movie_data)
'''
电影名称  打斗镜头  接吻镜头 电影类型
0   无问东西     1   101  爱情片
1  后来的我们     5    89  爱情片
2    前任3    12    97  爱情片
3   红海行动   108     5  动作片
4  唐人街探案   112     9  动作片
5     战狼   115     8  动作片
'''

“”“使用{}创建字典”""

scores = {'张三': 100}
print(scores)  # {'张三': 100}

2.计算已知类别数据集中的点与当前点之间的距离

new_data = [24, 67]
dist = list((((movie_data.iloc[:6, 1:3] - new_data) ** 2).sum(1)) ** 0.5)
print(dist)
'''创建列表的第二种方式,使用内置函数list()'''

lst2 = list(['hello', 'world', 98])
print(lst2)  # ['hello', 'world', 98]

在这里插入图片描述

在这里插入图片描述

列相加所以sum(1)

在这里插入图片描述

在这里插入图片描述

3.将距离升序排列,然后选取距离最小的k个点

dist_l = pd.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])})
print(dist_l)
k = 4;
dr = dist_l.sort_values(by='dist')[:4]
print(dr)

在这里插入图片描述

在这里插入图片描述

4.确定前k个点所在类别的出现频率

re = dr.loc[:, 'labels'].value_counts()
print(re);

在这里插入图片描述

在这里插入图片描述

5.选择频率最高的类别作为当前点的预测类别

result = []
result.append(re.index[0])
print(result)#[爱情片]

标签:dist,爱情片,Python,近邻,电影,算法,类别
来源: https://blog.csdn.net/llf000000/article/details/123171757

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有