k-近邻(knn)算法


最近小阿奇在学习机器学习算法,所以决定把相关原理和代码整理出来和小伙伴们一起分享

一、k近邻算法的概述

k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法。KNN的工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最近的k个点来投票决定X归为哪一类。
在这里插入图片描述
如上图所示
当k的范围改变,绿色圆点会有不一样的类别
当k=3时(实线范围),绿色圆点属于红色三角这种类别;
当k=5时(虚线范围),绿色圆点属于蓝色方块这种类别。

那如何判断一部电影属于爱情片还是动作片呢?

电影名称 打斗镜头 接吻镜头 电影类型
无问西东 1 101 爱情片
后来的我们 5 89 爱情片
前任3 12 97 爱情片
红海行动 108 5 动作片
唐人街探案 112 9 动作片
战狼2 115 8 动作片
新电影 24 67

我们将表中已有数据作为样本数据,打斗镜头和接吻镜头作为数据特征。如何用knn算法给出新电影的电影类型呢?
在这里插入图片描述将数据放在坐标图中可以发现,新电影更加偏向于爱情片。那么从k近邻角度来说,它主要通过未知点和已知数据集中的数据点之间的距离进行判断得出最终结果。
在二维平面角度距离公式:
在这里插入图片描述那么在多维空间里,欧式距离公式可以帮我们很好地解决:
在这里插入图片描述k近邻算法的主要步骤:
(1) 计算已知类别数据集中的点与当前点之间的距离;
(2) 按照距离递增次序排序
(3) 选取与当前点距离最小的k个点;
(4) 确定前k个点所在类别的出现频率;
(5) 返回前k个点出现频率最高的类别作为当前点的预测类别。
当k=4时,那么在这个电影例子中,把距离按照升序排列,距离绿点电影最近的前4个的电影分别是《后来的我们》、《前任3》、《无问西东》和《红海行动》,这四部电影的类别统计为爱情片:动作片=3:1,出现频率最高的类别为爱情片,所以在k=4时,绿点电影的类别为爱情片。这个判别过程就是k-近邻算法。
然而k的选取得不同也得到不一样的结果,那么如何确定k的值呢?
李航书上讲到,我们一般选取一个较小的数值,通常采取交叉验证法来选取最优的k值。(也就是说,选取k值很重要的关键是实验调参,类似于神经网络选取多少层这种,通过调整超参数来得到一个较好的结果)

二、用python实现k近邻算法

1.算法实现

import pandas as pd

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

#根据上面距离公式,求出距离
new_data = [24,67]
dist = list((((movie_data.iloc[:6,1:3]-new_data)
  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值