上一期文章:「10」民主投票法——KNN的秘密 中,我们剖析了KNN算法的本质和特点、局限。这里我们用python代码进行KNN的实现。第1部分是KNN的基础算法步骤,第2部分是一个电影分类的实战项目。

OK, let's begin~

KNN算法实现

 1 #!/usr/bin/env python2 # -*- coding:utf-8 -*-4 import csv5 import random6 import math7 import operator8 9 # 加载数据集
10 def loadDataset(filename, split, trainingSet = [], testSet = []):
11     with open(filename, 'r') as csvfile:
12         lines = csv.reader(csvfile)
13         dataset = list(lines)
14         for x in range(len(dataset)-1):
15             for y in range(4):
16                 dataset[x][y] = float(dataset[x][y])
17             if random.random() < split:  #将数据集随机划分
18                 trainingSet.append(dataset[x])
19             else:
20                 testSet.append(dataset[x])
21
22 # 计算点之间的距离,多维度的
23 def euclideanDistance(instance1, instance2, length):
24     distance = 0
25     for x in range(length):
26         distance += pow((instance1[x]-instance2[x]), 2)
27     return math.sqrt(distance)
28
29 # 获取k个邻居
30 def getNeighbors(trainingSet, testInstance, k):
31     distances = []
32     length = len(testInstance)-1
33     for x in range(len(trainingSet)):
34         dist = euclideanDistance(testInstance, trainingSet[x], length)
35         distances.append((trainingSet[x], dist))   #获取到测试点到其他点的距离
36     distances.sort(key=operator.itemgetter(1))    #对所有的距离进行排序
37     neighbors = []
38     for x in range(k):   #获取到距离最近的k个点
39         neighbors.append(distances[x][0])
40         return neighbors
41
42 # 得到这k个邻居的分类中最多的那一类
43 def getResponse(neighbors):
44     classVotes = {}
45     for x in range(len(neighbors)):
46         response = neighbors[x][-1]
47         if response in classVotes:
48             classVotes[response] += 1
49         else:
50             classVotes[response] = 1
51     sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)
52     return sortedVotes[0][0]   #获取到票数最多的类别
53
54 #计算预测的准确率
55 def getAccuracy(testSet, predictions):
56     correct = 0
57     for x in range(len(testSet)):
58         if testSet[x][-1] == predictions[x]:
59             correct += 1
60     return (correct/float(len(testSet)))*100.0
61
62
63 def main():
64     #prepare data
65     trainingSet = []
66     testSet = []
67     split = 0.67
68     loadDataset(r'irisdata.txt', split, trainingSet, testSet)
69     print('Trainset: ' + repr(len(trainingSet)))
70     print('Testset: ' + repr(len(testSet)))
71     #generate predictions
72     predictions = []
73     k = 3
74     for x in range(len(testSet)):
75         # trainingsettrainingSet[x]
76         neighbors = getNeighbors(trainingSet, testSet[x], k)
77         result = getResponse(neighbors)
78         predictions.append(result)
79         print ('predicted=' + repr(result) + ', actual=' + repr(testSet[x][-1]))
80     print('predictions: ' + repr(predictions))
81     accuracy = getAccuracy(testSet, predictions)
82     print('Accuracy: ' + repr(accuracy) + '%')
83
84 if __name__ == '__main__':
85     main()

电影分类实战

第一步:准备下电影分类数据集

上面数据集中序号1-12为已知的电影分类,分为喜剧片、动作片、爱情片三个种类,使用的特征值分别为搞笑镜头、打斗镜头、拥抱镜头的数量。那么来了一部新电影《唐人街探案》,它属于上述3个电影分类中的哪个类型?用KNN是怎么做的呢?

首先,我们构建一个已分好类的数据集。对于一个规模巨大的数据集,显然数据库是更好的选择。这里为了方便验证,使用Python的字典dict构造数据集。


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, "?片"]。这里我们使用上一篇文章中讲到的欧氏距离。

其中x,y为2个样本,n为维度,xi,yi为x,y第i个维度上的特征值。如x为:"唐人街探案": [23, 3, 17, "?片"],y为:"伦敦陷落": [2, 3, 55, "动作片"],则两者之间的距离为:

得到d = 43.42。然后求与数据集中所有数据的距离:

x = [23, 3, 17]
KNN = []
for key, v in movie_data.items():d = math.sqrt((x[0] - v[0]) ** 2 + (x[1] - v[1]) ** 2 + (x[2] - v[2]) ** 2)KNN.append([key, round(d, 2)])
print(KNN)

输出结果:

[['谍影重重', 43.87],
['伦敦陷落', 43.42],
['澳门风云3', 32.14],
['叶问3', 52.01],
['我的特工爷爷', 17.49],
['新步步惊心', 34.44],
['宝贝当家', 23.43],
['功夫熊猫3', 21.47],
['奔爱', 47.69],
['美人鱼', 18.55],
['夜孔雀', 39.66],
['代理情人', 40.57]]

第三步:按照距离大小进行递增排序

KNN.sort(key=lambda dis: dis[1])

输出结果

[['我的特工爷爷', 17.49],
['美人鱼', 18.55],
['功夫熊猫3', 21.47],
['宝贝当家', 23.43],
['澳门风云3', 32.14],
['新步步惊心', 34.44],
['夜孔雀', 39.66],
['代理情人', 40.57],
['伦敦陷落', 43.42],
['谍影重重', 43.87],
['奔爱', 47.69],
['叶问3', 52.01]]

第四步:选取距离最小的k个样本

这里取k=5

KNN=KNN[:5]

输出:

[['我的特工爷爷', 17.49],
['美人鱼', 18.55],
['功夫熊猫3', 21.47],
['宝贝当家', 23.43],
['澳门风云3', 32.14]]

第五步:确定前k个样本所在类别出现的频率,并输出出现频率最高的类别

labels = {"喜剧片":0,"动作片":0,"爱情片":0}
for sin KNN:label = movie_data[s[0]]labels[label[3]] += 1
labels =sorted(labels.items(),key=lambdal: l[1],reverse=True)
print(labels,labels[0][0],sep='\n')

输出结果:

[('喜剧片', 4), ('动作片', 1), ('爱情片', 0)]

最后的结果为喜剧片,符合我们的判断。

参考文章

  • K最近邻算法(KNN)
  • 《机器学习实战》
  • kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法

「11」Python实战篇:利用KNN进行电影分类相关推荐

  1. Python数据挖掘实战篇:利用KNN进行电影分类

    题目 下面数据集中序号1-12为已知的电影分类,分为喜剧片.动作片.爱情片三个种类,使用的特征值分别为搞笑镜头.打斗镜头.拥抱镜头的数量.那么来了一部新电影<万里归途>,它属于上述3个电影 ...

  2. 「网络安全」安全设备篇(7)——抗DDOS产品

    概述 DDOS攻击随着互联网的快速发展,日益猖獗,从早期的几兆.几十兆,到现在的几十G.几十T的流量攻击,形成了一个很大的利益链.DDOS攻击由于容易实施.难以防范.难以追踪,成为最难解决的网络安全问 ...

  3. 「网络安全」安全设备篇(3)——IPS

    什么是IPS? IPS是英文"Intrusion Prevention Systems"的缩写,中文意思是"入侵防御系统",IPS实现实时检查和阻止入侵. 上文 ...

  4. 「网络安全」安全设备篇(1)——防火墙

    什么是防火墙? 防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合.它可以通过监测.限制.更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息.结构 ...

  5. 局域网arp攻击_「网络安全」常见攻击篇(23)——ARP攻击

    什么是ARP攻击? ARP攻击是利用ARP协议设计时缺乏安全验证漏洞来实现的,通过伪造ARP数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害. ARP攻击原理 ARP病 ...

  6. python实战篇(五)---百度api实现车型识别

    十二年来,有笑泪,有阴晴,相伴一场,人来人往,只是日常.--蔡康永 前言 api全称为应用程序接口,说白了就是别人写好了一个可实现功能的函数接口,我们可以直接调用来实现功能,今天,我们一起来学习,用百 ...

  7. python实战篇(六)---打造自己的签名软件

    为什么上帝看到思考的人会笑?那是因为人在思考,却又抓不住真理.因为人越思考,一个人的思想就越跟另一个人的思想相隔万里. --米兰·昆德拉 Python实战篇重在实战,今天,我们就来设计一款自己的签名软 ...

  8. 性能调优之三十六计 —— 「取而代之」Echo/Json 篇

    文章目录 性能调优之三十六计 -- 「取而代之」Echo/Json 篇 Echo 高性能.极简框架 C.JSON Json-iterator Q&A 附录 性能调优之三十六计 -- 「取而代之 ...

  9. 「网络安全」安全设备篇(4)——防火墙、IDS、IPS的区别

    前面三篇文章,针对防火墙.IDS.IPS做了详细介绍,具体内容这里不再赘述,感兴趣的小伙伴可以去看看哦. 概念不同 防火墙和IPS属于访问控制类产品,而IDS属于审计类产品.我们可以用一个简单的比喻, ...

最新文章

  1. MySQL为Null导致莫名其妙的5大坑
  2. Java学习笔记之[ 利用扫描仪Scanner进行数据输入 ]
  3. MDSF:在线查看【模型驱动软件工厂】文章汇总
  4. 快速获取Android应用包名和Activity名
  5. STM32 电机教程 33 - 无刷电机无感控制快速实现
  6. 练习一:GitHub Desktop下载及使用
  7. 《王者荣耀》游戏技术总监:技术架构与同步方案上做出改变?
  8. 学pyqt5之前需要学python吗_快速学习pyqt5(1)--入门
  9. 计算机在娱乐中的应用有哪些,多媒体技术在娱乐方面的应用
  10. Python花式编程:多层嵌套列表扁平化
  11. 浅谈细说 JS 函数(call,apply,重载)
  12. 依赖注入参考文章(1)
  13. golang中获取公网ip、查看内网ip、检测ip类型、校验ip区间、ip地址string和int转换、根据ip判断地区国家运营商等
  14. activiti7对接springboot
  15. JAVAWEB NOTE 3
  16. .fai 文件格式解读
  17. Xcode9点击对象跳转
  18. 【ice】飞冰快速上手笔记
  19. CHAPTER 2 Docker镜像
  20. JAVA实现简单的猜数字游戏

热门文章

  1. 三、IP和IP地址区别和联系
  2. 《深度学习》(美)Ian Goodfellow 花书简要笔记(第一部分:应用数学与机器学习基础)
  3. python 静态网页_Python静态网页爬虫相关知识
  4. (附源码)计算机毕业设计SSM基于Web课堂签到管理系统
  5. 如何解析复杂的C语言声明
  6. 树莓派Pico-Raspberry Pi Pico安装及使用
  7. 【system】四大CPU体系结构ARM、X86/Atom、MIPS、PowerPC
  8. 618盛况空前 斐讯商城祭出了“杀手锏”
  9. 图像清晰度评价15种方法对比
  10. 40句让你坦露心声的句子