KNN没有显示的学习过程,简单粗暴:
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的
个实例,这
个实例的多数属于某个类,就把该输入实例分为这个类。
1. 训练数据集
,其中 ,即总共有 个类
2. 算法
输入:实例特征向量
输出:实例
所属的类
(1)根据给定的定量距离,在训练数据集
中找出与
最邻近的
个点,涵盖
个点的邻域记做
(2)在
中根据分类规则决定
的类别
3. 实际应用
表格和代码参考https://blog.csdn.net/saltriver/article/details/52502253
电影名称 | 搞笑镜头 | 拥抱镜头 | 打斗镜头 | 电影类型 |
---|---|---|---|---|
宝贝当家 | 45 | 2 | 9 | 喜剧片 |
美人鱼 | 21 | 17 | 5 | 喜剧片 |
澳门风云3 | 54 | 9 | 11 | 喜剧片 |
功夫熊猫3 | 39 | 0 | 31 | 喜剧片 |
谍影重重 | 5 | 2 | 57 | 动作片 |
叶问3 | 3 | 5 | 67 | 动作片 |
伦敦陷落 | 2 | 5 | 89 | 动作片 |
我的特工爷爷 | 5 | 7 | 77 | 动作片 |
奔爱 | 7 | 46 | 4 | 爱情片 |
夜孔雀 | 9 | 39 | 8 | 爱情片 |
代理情人 | 9 | 38 | 2 | 爱情片 |
新步步惊心 | 8 | 34 | 17 | 爱情片 |
唐人街探案 | 23 | 3 | 17 |
import numpy as np
#数据训练集
TrainData = {"宝贝当家": [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, "爱情片"]}
#计算 唐人街探案 到其他电影的欧式距离
Input = [23, 3, 17]
KNN = [] #list存储计算的距离
for Key in TrainData:
#计算距离
dist = np.sqrt(np.square(TrainData[Key][0] - Input[0]) + np.square(TrainData[Key][1] - Input[1]) + np.square(TrainData[Key][2] - Input[2]))
#添加到list
KNN.append([Key, round(dist, 2)])
print(KNN)
#排序,取k=5
KNN.sort(key=lambda d: d[1])
KNN=KNN[0:5]
#多数表决
labels = {"喜剧片":0,"动作片":0,"爱情片":0}
for index in KNN:
movieName = index[0] #电影名称
moiveClass = TrainData[movieName][3] #电影类别
labels[ moiveClass ]+= 1
labels=sorted(labels.items(),key=lambda l: l[1],reverse=True)
print(labels,labels[0][0],sep='\n')