使用k-近邻算法分类爱情片和动作片

有人曾经统计过 很多电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻镜头数。假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用kNN来解决这个问题。

首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,图中问号位置是该未知电影出现的镜头数图形化展示,具体数据如下:

即使不知道未知电影属于哪种类型,我们也可以通过某种方法计算出来。首先计算未知电影与样本集中其他电影的距离,如表所示。此处暂时不要关心如何计算得到这些距离值,使用Python实现电影分类应用时,会提供具体的计算方法。

现在我们得到了样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到k个距离最近的电影。假定k=3,则三个最靠近的电影依次是He’sNotReallyintoDudes、BeautifulWoman和CaliforniaMan。k-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。

k-近邻算法的一般流程

(1)收集数据:可以使用任何方法。

(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式。

(3)分析数据:可以使用任何方法。

(4)训练算法:此步骤不适用于k-近邻算法。

(5)测试算法:计算错误率。(本次实验数据太少,故没有进行算法测试)

(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

具体代码如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
from sklearn.preprocessing import MinMaxScaler
import operatordef file_matrix(file_name):"""准备数据,从文本文件中解析数据:param file_name: 文件名称:return: 特征值矩阵(数据集)、目标值向量"""with open(file_name, "r") as f:# 以行读取文件内容lines_data = f.readlines()# 统计文件行数lines_num = len(lines_data)# 返回的numpy矩阵,解析完成的数据:lines_num行,2列data_set = np.zeros((lines_num, 2))# 返回的分类标签向量labels = []# 行索引indexindex = 0for line in lines_data:# 去除行数据两端的空格line = line.strip()# 使用s.split(str="",num=string,cout(str))将字符串根据','分隔符进行切片。line = line.split(",")# 将数据前两列提取出来,存放到return_mat的NumPy矩阵中,也就是特征矩阵data_set[index, :] = line[0:2]# 将目标值放入分类标签向量中labels.append(line[-1])index += 1return data_set, labelsdef show_data(data_set, labels):"""分析数据,数据可视化,使用Matplotlib创建散点图:param data_mat: 特征值矩阵(数据集):param labels: 目标值向量:return: None"""# 画布的大小为(13, 9)plt.figure(figsize=(8, 4))# 设置点的颜色labels_colors = []for data in labels:if data == "love":labels_colors.append("red")elif data == "action":labels_colors.append("green")# 画出散点图,x轴打斗镜头次数、y轴为接吻镜头次数,散点大小为15,透明度为0.5plt.scatter(x=data_set[:, 0], y=data_set[:, 1], marker=".", color=labels_colors, s=15, alpha=0.5)# 设置标题,x轴label,y轴labeltitle_text = plt.title("每部电影的接吻镜头次数与打斗镜头次数")xlabel_text = plt.xlabel("打斗镜头次数")ylabel_text = plt.ylabel("接吻镜头次数")# 设置标题,x轴label,y轴label的字体大小、是否加粗、颜色plt.setp(title_text, size=12, weight='bold', color='red')plt.setp(xlabel_text, size=10, weight='bold', color='black')plt.setp(ylabel_text, size=10, weight='bold', color='black')# 设置图例love = mlines.Line2D([], [], color='red', marker='.', markersize=6, label='爱情片')action = mlines.Line2D([], [], color='green', marker='.', markersize=6, label='动作片')# 添加图例plt.legend(handles=[love, action])# 显示图片plt.show()def auto_normal(data_set):"""准备数据,数据归一化处理:param data_set: 需要进行归一化的数据集:return: 归一化是数据集、最小值与最大值的范围、最小值"""# 获得每列数据的最小值min_val = data_set.min(0)# 最大值和最小值的范围ranges = data_set.max(0) - min_val# feature_range=(0, 1) 数据返回值在(0,1)之间# 对数据进行归一化处理mms = MinMaxScaler(feature_range=(0, 1))normal_data = mms.fit_transform(data_set)return normal_data, min_val, rangesdef kNN(inX, data_set, labels, k):"""KNN算法分类器:param inX: 用于分类的数据(测试集):param data_set: 用于训练的数据(训练集):param labels: 训练数据的分类标签:param k: kNN算法参数,选择距离最小的k个点:return: 分类结果"""# numpy函数shape[0]返回data_set的行数data_num = data_set.shape[0]# 在列向量方向上重复inX共1次(横向),行向量方向上重复inX共data_num次(纵向)diff_mat = np.tile(inX, (data_num, 1)) - data_set# 二维特征相减后平方distances_sq = diff_mat ** 2# sum()所有元素相加,sum(0)列相加,sum(1)行相加distances_sq_sum = distances_sq.sum(axis=1)# 开方,计算出距离distances = distances_sq_sum ** 0.5# 返回distances中元素从小到大排序后的索引值dist_index_sort = distances.argsort()# 定一个记录类别次数的字典class_count = {}for i in range(k):# 取出前k个元素的类别label = labels[dist_index_sort[i]]# dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。# 计算类别次数class_count[label] = class_count.get(label, 0) + 1# python2中用iteritems()替换python3中的items()# key=operator.itemgetter(1)根据字典的值进行排序# key=operator.itemgetter(0)根据字典的键进行排序# reverse降序排序字典class_count_sorted = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)# 返回次数最多的类别,即所要分类的类别return class_count_sorted[0][0]def data_deal(data, min_val, ranges):"""# 测试集归一化:param data: 将要归一化处理的数据:param min_val: 训练集的每列最小值:param ranges: 训练集的每列取值范围:return:归一化处理后的数据"""data_normal = (data - min_val) / rangesreturn data_normaldef movie_class(normal_data, labels, min_val, ranges):# 二维特征用户输入action_num = int(input("请输入本电影出现的打斗镜头次数:"))love_num = int(input("请输入本电影出现的接吻镜头次数:"))# 生成NumPy数组,测试集data = np.array([action_num, love_num])# 测试集归一化data_normal = data_deal(data, min_val, ranges)# 返回分类结果classify_result = kNN(data_normal, normal_data, labels, 3)# 输出结果if classify_result == "love":classify_result = "爱情片"elif classify_result == "action":classify_result = "动作片"print("本部电影可能是%s" % classify_result)if __name__ == '__main__':# 文件名称file_name = "movies.txt"# 读取文件数据集data_set, labels = file_matrix(file_name)# 数据可视化show_data(data_set, labels)# 数据集归一化处理normal_data, min_val, ranges = auto_normal(data_set)# 使用分类器movie_class(normal_data, labels, min_val, ranges)

运行结果:

请输入本电影出现的打斗镜头次数:18
请输入本电影出现的接吻镜头次数:90
本部电影可能是爱情片

代码数据:

3,104,love
2,100,love
1,81,love
101,10,action
99,5,action
98,2,action

K-近邻算法(初级:电影分类)相关推荐

  1. k近邻算法_机器学习分类算法之k近邻算法

    本编文章将介绍机器学习入门算法-k近邻算法,将会用demo演示机器学习分类算法. 在先介绍算法时,先回顾分类和回归的区别.像文章分类识别也是这样处理的,如1代表体育,2代表科技,3代表娱乐属于分类问题 ...

  2. 【计算机视觉之三】运用k近邻算法进行图片分类

    这篇文章主要给不知道计算机视觉是啥的人介绍一下图像分类问题以及最近的最近邻算法. 目录 图像分类 1.1 图像分类的原理 1.2 面临的问题 1.3 图像分类任务 最近邻算法 代码实现 L2距离 用k ...

  3. 【机器学习】sklearn机器学习入门案例——使用k近邻算法进行鸢尾花分类

    1 背景 这个案例恐怕已经被说的很烂了,机器学习方面不同程度的人对该案例还是有着不同的感觉.有的人追求先理解机器学习背后的理论甚至自己推导一遍相关数学公式,再用代码实现:有的人则满足于能够实现相关功能 ...

  4. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

  5. 一文搞懂K近邻算法(KNN),附带多个实现案例

    简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...

  6. C++实现的简单k近邻算法(K-Nearest-Neighbour,K-NN)

    C++实现的简单的K近邻算法(K-Nearest Neighbor,K-NN) 前一段时间学习了K近邻算法,对K近邻算法有了一个初步的了解,也存在一定的问题,下面我来简单介绍一下K近邻算法.本博客将从 ...

  7. K近邻算法的Python实现

    作为『十大机器学习算法』之一的K-近邻(K-Nearest Neighbors)算法是思想简单.易于理解的一种分类和回归算法.今天,我们来一起学习KNN算法的基本原理,并用Python实现该算法,最后 ...

  8. K近邻算法:以同类相吸解决分类问题!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:游璐颖,福州大学,Datawhale成员 前言 KNN(k-nea ...

  9. 09_分类算法--k近邻算法(KNN)、案例、欧氏距离、k-近邻算法API、KNeighborsClassifier、及其里面的案例(网络资料+学习资料整理笔记)

    1 分类算法–k近邻算法(KNN) 定义:如果一个样本在特征空间中**k个最相似(即特征空间中最邻近)**的样本中的大多数属于某一个类别,则该样本也属于这个类别,则该样本也属于这个类别. k-近邻算法 ...

  10. 第4章 最基础的分类算法-k近邻算法

    思想极度简单 应用数学知识少 效果好(缺点?) 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 distances = [] for x_train in X_train ...

最新文章

  1. 《为了你我愿意热爱整个世界》
  2. 【C++】类型转换简述:四种类型转换方式的说明及应用
  3. Android学习笔记:对Android应用进行单元测试
  4. Android SDK 快速安装方法
  5. 公众号内打开提示404_微信公众号文章“号内搜”新功能玩法
  6. unity及unity hub下载官网
  7. Part.0模糊集表示方法
  8. SpringAOP简单案例
  9. U-GAT-IT 论文翻译
  10. JQuery淡出淡入动画
  11. 英语学习者的十句经典名言
  12. 计算机ip地址在哪找,如何查ip地址,电脑ip地址在哪看
  13. 2020-05-09 工作中英语单词积累
  14. 视频按帧截取 python程序
  15. 尝试创建windows XP最长的路径名
  16. ffmpeg转码php配置,PHP+ffmpeg+nginx的配置实现视频转码
  17. 不会聊天怎么办?先做好这10件小事
  18. Mac连接网线能够接收微信消息,浏览器不能访问网页
  19. 微信html5复制剪切板,微信h5实现复制内容到剪贴板,两种方法
  20. ArcGIS Engine Runtime 10 中文补丁 可用于官方 ArcGIS Engine SP中文补丁的升级

热门文章

  1. decimal 整数 mysql_MySQL数据类型DECIMAL用法
  2. Android开发艺术探索五 RemoteView
  3. PayPal、支付宝诞生的故事 | 概述起源篇
  4. cocos2dx uv动画溢出_宝爷Debug小记——Cocos2d-x(3.13之前的版本)底层BUG导致Spine渲染花屏...
  5. What‘s Wrong with Copying?
  6. uva 12086 - Potentiometers(树状数组)
  7. VC中,AssertValid和Dump函数
  8. php获取基站,基站查询API接口_免费数据接口 - 极速数据
  9. 【ACSA】Beta Distribution Guided Aspect-aware Graph for Aspect Category Sentiment Analysis
  10. 测试1433端口通不通以及win10的telnet不是内部或外部命令