KNN 算法-理论篇-如何给电影进行分类
公号:码农充电站pro
主页:https://codeshellme.github.io
KNN 算法的全称是K-Nearest Neighbor,中文为K 近邻算法,它是基于距离的一种算法,简单有效。
KNN 算法即可用于分类问题,也可用于回归问题。
1,准备电影数据
假如我们统计了一些电影数据,包括电影名称,打斗次数,接吻次数,电影类型,如下:
| 电影名称 | 打斗次数 | 接吻次数 | 电影类型 |
|---|---|---|---|
| 黑客帝国 | 115 | 6 | 动作片 |
| 功夫 | 109 | 8 | 动作片 |
| 战狼 | 120 | 9 | 动作片 |
| 恋恋笔记本 | 5 | 78 | 爱情片 |
| 泰坦尼克号 | 6 | 60 | 爱情片 |
| 花样年华 | 8 | 69 | 爱情片 |
可以看到,电影分成了两类,分别是动作片和爱情片。
2,用KNN 算法处理分类问题
如果现在有一部新的电影A,它的打斗和接吻次数分别是80 和7,那如何用KNN 算法对齐进行分类呢?
我们可以将打斗次数作为X 轴,接吻次数作为Y 轴,将上述电影数据画在一个坐标系中,如下:

关于如何用Python 画图,可以参考文章《如何使用Python 进行数据可视化》
通过上图可以直观的看出,动作电影与爱情电影的分布范围是不同的。
KNN 算法基于距离,它的原理是:选择与待分类数据最近的K 个点,这K 个点属于哪个分类最多,那么待分类数据就属于哪个分类。
所以,要判断电影A 属于哪一类电影,就要从已知的电影样本中,选出距离电影A 最近的K 个点:
- 如果这K 个点中,属于动作电影较多,那么电影A 就属于动作电影。
- 如果这K 个点中,属于爱情电影较多,那么电影A 就属于爱情电影。
比如,我们从样本中选出三个点(即 K 为 3),那么距离电影A 最近的三个点是《功夫》,《黑客帝国》和《战狼》,而这三部电影都是动作电影。因此,可以判断电影A 也是动作电影。
另外,我们还要处理两个问题:
- 如何判断点之间的距离。
- 如何确定K 的值。
关于点之间的距离判断,可以参考文章《计算机如何理解事物的相关性》。
至于K 值的选择,K 值较大或者较小都会对模型的训练造成负面影响,K 值较小会造成过拟合,K 值较大欠拟合。
因此,K 值的选择,一般采用交叉验证的方式。
交叉验证的思路是,把样本集中的大部分样本作为训练集,剩余部分用于预测,来验证分类模型的准确度。一般会把 K 值选取在较小范围内,逐一尝试K 的值,当模型准确度最高时,就是最合适的K 值。
可以总结出,KNN 算法用于分类问题时,一般的步骤是:
- 计算待分类物体与其他物体之间的距离;
- 按照距离进行排序,统计出距离最近的 K 个邻居;
- K 个最近的邻居,属于哪个分类最多,待分类物体就属于哪一类。
3,用KNN 算法处理回归问题
如果,我们现在有一部电影B,知道该电影属于动作电影,并且知道该电影的接吻次数是7,现在想预测该电影的打斗次数是多少?
这个问题就属于回归问题。
分类问题的预测结果是离散值,
回归问题的预测结果是连续值。
首先看下,根据已知数据,如何判断出距离电影B 最近的K 个点。
我们依然设置K 为3,已知数据为:
- 电影B 属于动作电影。
- 电影B 的接吻次数是 7。
根据已知数据可以画出下图:

图中我画出了一条水平线,这条线代表所有接吻次数是7 的电影,接下来就是要找到距离这条线最近的三部(K 为 3)动作电影。
可以看到,距离这条水平线最近的三部动作电影是《功夫》,《黑客帝国》和《战狼》,那么这三部电影的打斗次数的平均值,就是我们预测的电影B 的打斗次数。
所以,电影B 的打斗次数是:
(115 + 109 +120) / 3 ≈ 115
4,总结
本篇文章主要介绍了KNN 算法的基本原理,它简单易懂,即可处理分类问题,又可处理回归问题。
KNN 算法是基于距离的一种机器学习算法,需要计算测试点与样本点之间的距离。因此,当数据量大的时候,计算量就会非常庞大,需要大量的存储空间和计算时间。
另外,如果样本数据分类不均衡,比如有些分类的样本非常少,那么该类别的分类准确率就会很低。因此,在实际应用中,要特别注意这一点。
(本节完。)
推荐阅读:
欢迎关注作者公众号,获取更多技术干货。

KNN 算法-理论篇-如何给电影进行分类的更多相关文章
- KNN 算法-实战篇-如何识别手写数字
公号:码农充电站pro 主页:https://codeshellme.github.io 上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数 ...
- 一步步教你轻松学支持向量机SVM算法之理论篇1
一步步教你轻松学支持向量机SVM算法之理论篇1 (白宁超 2018年10月22日10:03:35) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...
- [Python] 应用kNN算法预测豆瓣电影用户的性别
应用kNN算法预测豆瓣电影用户的性别 摘要 本文认为不同性别的人偏好的电影类型会有所不同,因此进行了此实验.利用较为活跃的274位豆瓣用户最近观看的100部电影,对其类型进行统计,以得到的37种电影类 ...
- 机器学习回顾篇(6):KNN算法
1 引言 本文将从算法原理出发,展开介绍KNN算法,并结合机器学习中常用的Iris数据集通过代码实例演示KNN算法用法和实现. 2 算法原理 KNN(kNN,k-NearestNeighbor)算法, ...
- knn原理及借助电影分类实现knn算法
KNN最近邻算法原理 KNN英文全称K-nearst neighbor,中文名称为K近邻算法,它是由Cover和Hart在1968年提出来的 KNN算法原理: 1. 计算已知类别数据集中的点与当前点之 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- KNN算法的补充
文本自动分类技术是文字管理的基础.通过快速.准确的文本自动分类,可以节省大量的人力财力:提高工作效率:让用户快速获得所需资源,改善用户体验.本文着重对KNN文本分类算法进行介绍并提出改进方法. 一.相 ...
- 3.朴素贝叶斯和KNN算法的推导和python实现
前面一个博客我们用Scikit-Learn实现了中文文本分类的全过程,这篇博客,着重分析项目最核心的部分分类算法:朴素贝叶斯算法以及KNN算法的基本原理和简单python实现. 3.1 贝叶斯公式的推 ...
- 数据挖掘之KNN算法(C#实现)
在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...
随机推荐
- NB-IoT窄带物联网技术的四大优势
NB-IoT是指窄带物联网(Narrow Band -Internet of Things)技术,是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWA) ...
- python求平均数及打印出低于平均数的值列表
刚学Python的时候还是要多动手进行一些小程序的编写,要持续不断的进行,知识才能掌握的牢.今天就讲一下Python怎么求平均数,及打印出低于平均数的数值列表 方法一: scores1 = [91, ...
- vim编辑器使用简介
使用格式 vim [option] /path/to/somefile ... option: -o水平分割 -O垂直分割 +打开后在最后一行 +Num打开后在地Num行,加号与Num之间不能有空格 ...
- 14、Cookie和Session组件
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- waeshall算法原理和实现
传递闭包Warshall方法简要介绍 ① 在集合X上的二元关系R的传递闭包是包含R的X上的最小的传递关系.R的传递闭包在数字图像处理的图像和视觉基础.图的连通性描述等方面都是基本概念.一般用B表示定义 ...
- Best Time to Buy and Sell Stock I II III IV
一.Best Time to Buy and Sell Stock I Say you have an array for which the ith element is the price of ...
- Golang中的OO(面向对象)
组合 > 继承 Go中的设计,以为继承的被诟病,所以Golang的设计团队在语言的设计时并没有采用经典的OO模式 那Golang中各个部分是怎么联系到一起的呢 type ReadWriter i ...
- Vue 计算属性与方法
computed 基本使用 如果数据需要有复杂的计算,则可以在Vue实例中定义计算属性,再交由mustache进行渲染. computed内部其实是通过getttr实现的,所以不用加括号即可完成其下方 ...
- 最大子段和问题(C/C++)
Description 给定有n个整数(可能为负整数)组成的序列a1,a2,...,an,求该序列连续的子段和的最大值. 如果该子段的所有元素和是负整数时定义其最大子段和为0. Input 第一行有一 ...
- rocketmq详解-[个人版]-第一章
一.消息队列概述 1.1.消息队列由来 在运维场景中,我们经常会存在如下场景:一旦出现S1异常,C1将因为S1的影响而异常(C为客户端,s为服务端) 当然可以通过添加多个S的方式,实现高可用.但这样会 ...