机器学习第二篇:详解KNN算法

机器学习第二篇:详解KNN算法

01|算法简介:

KNN是英文k-nearest neighbor的缩写,表示K个最接近的点。该算法常用来解决分类问题,具体的算法原理就是先找到与待分类值A距离最近的K个值,然后判断这K个值中大部分都属于哪一类,那么待分类值A就属于哪一类。

这其实和我们生活中对人的评价方式一致,你想知道一个人是什么样的人,你只需要找到跟他关系最近(好)的K个人,然后看这K个人都是什么人,就可以判断出他是什么样的人了。

02|算法三要素:

通过该算法的原理,我们可以把该算法分解为3部分,第一部分就是要决定K值,也就是要找他周围的几个值;第二部分是距离的计算,即找出距离他最近的K个值;第三部分是分类规则的确定,就是以哪种标准去评判他是哪一类。

1、K值的选取

K值的选取将会对KNN算法的结果产生重大的影响,下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

www.zeeklog.com - 机器学习第二篇:详解KNN算法

图2.1——来源于网络

大家可以看到k值的选取会直接影响到评测结果,如果k值选取过大,相当于用较大领域中的训练实例进行预测,这样看起来是觉得数据越多可能越准确,但实际上并不然,如果要想获得较多个k值,这样你就需要把距离进一步扩大,预测准确率自然会下降。

还是拿那个我们判断一个人是什么样子的人为例,如果选择较大的k值比如一个班的人,然后根据这一个班所有人的情况去预测这个班里面的某一个人是什么样子的,这样很明显是不准确的。

如果k值选取过小,则这些很有可能是特例,也会影响预测的结果。

过大也不好,过小也不好,那么我们该怎么办?最笨的也是最有效的方法就是试,我们在上一篇推文说模型选择有一种方法是交叉验证,。我们在k值选择的时候也可以用交叉验证这种方法。

2、距离的度量

我们在评判人与人之间的关系远近的时候没有一个量化的关系,只会用一些词去形容两个人之间关系的远近,比如闺蜜(发小)》舍友》同学。

但在统计学习中我们评判两者的远近关系的时候是有一个可以量化的东西,这里我们用的是欧式距离。

欧式距离又称欧几里得距离,是指在m维空间中,两个点之间的真实距离。

  • 二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:
  • 三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:
  • 两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:

也可以用表示成向量运算的形式:

当然我们还可以使用其他距离来度量两者的远近关系,比如曼哈顿距离(是不是觉得名字很高大上),更多详情点击:https://wenku.baidu.com/view/ebde5d0e763231126edb1113.html

3、分类规则的确定:

这里我们目前就使用多数表决的分类规则,即这距离最近的k个值中的大部分值的类别就是待预测值的类别。

04|算法步骤:

  1. 收集数据:找寻待训练的文本数据。
  2. 准备数据:利用python解析文本文件。
  3. 分析数据:对数据进行一些统计分析,有个基本的认识。
  4. 训练算法:KNN没有这一步,这也是为何被称为最懒算法的原因。
  5. 测试算法:将提供的数据利用交叉验证的方式进行算法的测试。
  6. 使用算法:将测试得到的准确率较高的算法直接应用到实际中。

05|利用python对未知电影进行分类:

1、背景:

假设爱情电影和动作电影之间的区别可以用打斗次数和接吻次数这两个特征来决定,下面提供了一些电影的类别以及其对应的接吻和打斗次数(训练数据集)。

www.zeeklog.com - 机器学习第二篇:详解KNN算法

表6-1:来源于网络

现在有一电影A,已知其打斗次数为18,接吻次数为90,需要利用knn算法去预测该电影属于哪一类别。

2、准备数据

www.zeeklog.com - 机器学习第二篇:详解KNN算法
www.zeeklog.com - 机器学习第二篇:详解KNN算法

3、分析数据

www.zeeklog.com - 机器学习第二篇:详解KNN算法
www.zeeklog.com - 机器学习第二篇:详解KNN算法

4、测试算法

www.zeeklog.com - 机器学习第二篇:详解KNN算法

通过测试最后得出,如果一部电影中含有18次打斗次数,90次接吻次数,那么可以判定为该电影是爱情片。

5、应用算法:

通过修改inX的值,就可以直接得出该电影的类型。

06|最后:

上面python实现过程中涉及的一些知识点:

  1. pandas数据转换成numpy,df.matrix()
  2. matplotlib中文显示乱码问题
  3. 列表生成式
  4. np.tile()函数
  5. np.sum()函数
  6. np.argsort()函数
  7. dict.get()方法
  8. dict.items()方法
  9. operator.itemgetter()函数

Read more

【spring02】Spring 管理 Bean-IOC,基于 XML 配置 bean

【spring02】Spring 管理 Bean-IOC,基于 XML 配置 bean

文章目录🌍一. bean 创建顺序🌍二. bean 对象的单例和多例❄️1. 机制❄️2. 使用细节🌍三. bean 的生命周期🌍四. 配置 bean 的后置处理器 【这个比较难】🌍五. 通过属性文件给 bean 注入值🌍六. 基于 XML 的 bean 的自动装配🌍七. spring el 表达式[知道即可] 🙋‍♂️ 作者:@whisperrr.🙋‍♂️ 👀 专栏:spring👀 💥 标题:【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean💥 ❣️ 寄语:比较是偷走幸福的小偷❣️ 🌍一.

By Ne0inhk
MySQL 数据库核心操作全解析:从创建到备份与连接管理

MySQL 数据库核心操作全解析:从创建到备份与连接管理

前言:在数据库管理中,MySQL 作为开源关系型数据库的标杆,其基础操作是所有开发者和运维人员的必备技能。本文将从数据库的创建、编码配置、查看修改,到备份恢复与连接监控,逐步拆解核心操作,结合实操命令与原理讲解,帮你彻底掌握 MySQL 基础管理逻辑。 一、数据库创建:基础语法与本质解析 创建数据库是 MySQL 操作的起点,掌握其语法规则与底层原理,能避免后续使用中的诸多问题。 1.1 核心创建语法 MySQL 创建数据库的标准语法如下,其中 [] 内的关键字为可选参数,用于提升操作安全性: CREATE DATABASE [IF NOT EXISTS] database_name; * IF NOT EXISTS:关键安全参数。若数据库已存在,不加此参数会直接报错;添加后会将报错转为警告,避免程序执行中断。 * 语法大小写特性:MySQL 语法不区分大小写,但行业惯例会将关键字(如CREATE

By Ne0inhk
基于Rust实现爬取 GitHub Trending 热门仓库

基于Rust实现爬取 GitHub Trending 热门仓库

基于Rust实现爬取 GitHub Trending 热门仓库 这个实战项目将使用 Rust 实现一个爬虫,目标是爬取 GitHub Trending 页面的热门 Rust 仓库信息(仓库名、描述、星标数、作者等),并将结果输出为 JSON 文件。本次更新基于优化后的代码,重点提升了错误处理容错性和 CSS 选择器稳定性。 技术栈 * HTTP 请求:reqwest( Rust 最流行的 HTTP 客户端,支持异步) * HTML 解析:scraper(基于 selectors 库,支持 CSS 选择器,轻量高效) * JSON 序列化:serde + serde_json( Rust 标准的序列化

By Ne0inhk
【MySQL】从零开始学习MySQL:基础与安装指南

【MySQL】从零开始学习MySQL:基础与安装指南

MySQL作为世界上最受欢迎的关系型数据库之一,在电商、SNS、论坛等场景中应用广泛。作为学计算机的,数据库的水平是衡量一个程序员水平的重要指标需要掌握MySQL。本文 将以Linux下的MySQL,从基础概念出发,完成MySQL安装。 一、MySQL基础认知:为什么选择它? 1.1什么是数据库? 简单来说,数据库是高效管理数据的工具。相比文件存储,它解决了四大问题: * 安全性:避免文件被随意修改或删除 * 易管理:支持快速查询、筛选和统计 * 可扩展:轻松应对海量数据存储 * 易集成:便于在程序中调用和操作 数据库的存储介质包括磁盘(持久化)和内存(临时缓存) 1.2主流数据库对比 选择数据库时,需根据项目规模和需求判断: * SQL Sever:微软产品,适合.NET程序员的最爱,中大型项目 * Oracle:甲骨文旗下,适合复杂业务逻辑的大型项目,但并发性能不如Mysql; * MySQL:开源免费,并发性能优秀,适合电商、

By Ne0inhk