机器学习笔记2——K近邻法KNN(分类)

KNN没有显示的学习过程,简单粗暴:
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 k 个实例,这 k 个实例的多数属于某个类,就把该输入实例分为这个类。

1. 训练数据集

( x i , y i ) , i = 1 , 2 , , n ,其中 y i { c 1 , c 2 , , c K } ,即总共有 K 个类

2. 算法

输入:实例特征向量 x
输出:实例 x 所属的类 y
(1)根据给定的定量距离,在训练数据集 T 中找出与 x 最邻近的 k 个点,涵盖 k 个点的邻域记做 N k ( x )
(2)在 N k ( x ) 中根据分类规则决定 x 的类别

y = a r g max c j x i N k ( x ) I ( y i = c j )
距离度量:一般使用欧式距离

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')

后记:关于字典、list的遍历和排序还需要加强,后面可以试着用数据库写。

猜你喜欢

转载自blog.csdn.net/qsdzxp/article/details/79685550