一、knn概念
knn(k near neighbor):每一个测试样本的类别都可以用和它最近的k个数据(邻居)的类别代表。
二、算法步骤
1.流程
初始化已知数据集
- 计算已知类别数据集中的点与当前点之间的距离
- 按距离递增次序排序
- 选取与当前点距离最小的k个点
- 统计前k个点所在的类别出现的频率
- 返回前k个点出现频率最高的类别作为当前点的预测分类
例子
这里采用的是欧氏距离!
2.代码如下
# -*- coding = utf-8 -*-
# @Time : 2021/3/11 12:41
# @Author : pinpin
# @File : knn.py
# @Software : PyCharm
import math
movie_data={
"宝贝当家":[45,2,9,"喜剧片"],
"美人鱼":[21,17,5,"喜剧片"],
"澳门风云3":[54,9,11,"喜剧片"],
"功夫熊猫3":[39,0,31,"喜剧片"],
"谍影重重":[5,2,57,"动作片"],
"叶问3":[3,2,65,"动作片"],
"伦敦陷落":[2,3,55,"动作片"],
"我的爷爷":[6,4,21,"动作片"],
"奔爱":[7,46,4,"爱情片"],
"夜孔雀":[9,39,8,'爱情片'],
"代理情人":[9,38,2,"爱情片"],
"新步步惊心":[8,34,17,"爱情片"]
}
#测试样本:唐人街探案[23,3,17,"?片”]
#计算测试样本与已知数据的距离,并保留两位小数
tr=[23,3,17]
KNN=[]
for key,v in movie_data.items():
d=(tr[0]-v[0])**2+(tr[1]-v[1])**2+(tr[2]-v[2])**2
KNN.append([key,round(d,2)])
#按照距离从小到大排序
#list的sort排序函数,lambda是匿名函数,dis:dis[1]指的是lambda表示的匿名函数的参数,这里按照参数类型的第二个元素递增排序
KNN.sort(key=lambda dis:dis[1] )
#选择距离最小的前k个样本,这里取5
KNN=KNN[:5]
#确定前K个样本所在类别出现的频率,并打印出来频率最高的类别
class_number={"动作片":0,"爱情片":0,"喜剧片":0}
for k in KNN:
leixing=movie_data[k[0]]
class_number[leixing[3]]+=1
class_number = sorted(class_number.items(),key=lambda l:l[1],reverse=True)
print(class_number[0][0],sep='\n')