「11」Python实战篇:利用KNN进行电影分类
上一期文章:「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进行电影分类相关推荐
- Python数据挖掘实战篇:利用KNN进行电影分类
题目 下面数据集中序号1-12为已知的电影分类,分为喜剧片.动作片.爱情片三个种类,使用的特征值分别为搞笑镜头.打斗镜头.拥抱镜头的数量.那么来了一部新电影<万里归途>,它属于上述3个电影 ...
- 「网络安全」安全设备篇(7)——抗DDOS产品
概述 DDOS攻击随着互联网的快速发展,日益猖獗,从早期的几兆.几十兆,到现在的几十G.几十T的流量攻击,形成了一个很大的利益链.DDOS攻击由于容易实施.难以防范.难以追踪,成为最难解决的网络安全问 ...
- 「网络安全」安全设备篇(3)——IPS
什么是IPS? IPS是英文"Intrusion Prevention Systems"的缩写,中文意思是"入侵防御系统",IPS实现实时检查和阻止入侵. 上文 ...
- 「网络安全」安全设备篇(1)——防火墙
什么是防火墙? 防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合.它可以通过监测.限制.更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息.结构 ...
- 局域网arp攻击_「网络安全」常见攻击篇(23)——ARP攻击
什么是ARP攻击? ARP攻击是利用ARP协议设计时缺乏安全验证漏洞来实现的,通过伪造ARP数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害. ARP攻击原理 ARP病 ...
- python实战篇(五)---百度api实现车型识别
十二年来,有笑泪,有阴晴,相伴一场,人来人往,只是日常.--蔡康永 前言 api全称为应用程序接口,说白了就是别人写好了一个可实现功能的函数接口,我们可以直接调用来实现功能,今天,我们一起来学习,用百 ...
- python实战篇(六)---打造自己的签名软件
为什么上帝看到思考的人会笑?那是因为人在思考,却又抓不住真理.因为人越思考,一个人的思想就越跟另一个人的思想相隔万里. --米兰·昆德拉 Python实战篇重在实战,今天,我们就来设计一款自己的签名软 ...
- 性能调优之三十六计 —— 「取而代之」Echo/Json 篇
文章目录 性能调优之三十六计 -- 「取而代之」Echo/Json 篇 Echo 高性能.极简框架 C.JSON Json-iterator Q&A 附录 性能调优之三十六计 -- 「取而代之 ...
- 「网络安全」安全设备篇(4)——防火墙、IDS、IPS的区别
前面三篇文章,针对防火墙.IDS.IPS做了详细介绍,具体内容这里不再赘述,感兴趣的小伙伴可以去看看哦. 概念不同 防火墙和IPS属于访问控制类产品,而IDS属于审计类产品.我们可以用一个简单的比喻, ...
最新文章
- MySQL为Null导致莫名其妙的5大坑
- Java学习笔记之[ 利用扫描仪Scanner进行数据输入 ]
- MDSF:在线查看【模型驱动软件工厂】文章汇总
- 快速获取Android应用包名和Activity名
- STM32 电机教程 33 - 无刷电机无感控制快速实现
- 练习一:GitHub Desktop下载及使用
- 《王者荣耀》游戏技术总监:技术架构与同步方案上做出改变?
- 学pyqt5之前需要学python吗_快速学习pyqt5(1)--入门
- 计算机在娱乐中的应用有哪些,多媒体技术在娱乐方面的应用
- Python花式编程:多层嵌套列表扁平化
- 浅谈细说 JS 函数(call,apply,重载)
- 依赖注入参考文章(1)
- golang中获取公网ip、查看内网ip、检测ip类型、校验ip区间、ip地址string和int转换、根据ip判断地区国家运营商等
- activiti7对接springboot
- JAVAWEB NOTE 3
- .fai 文件格式解读
- Xcode9点击对象跳转
- 【ice】飞冰快速上手笔记
- CHAPTER 2 Docker镜像
- JAVA实现简单的猜数字游戏