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

机器学习第二篇:详解KNN算法
 简说Python推荐来源:俊红的数据分析之路 作者:张俊红 

我的2020总结,戳图片,留言抽大奖

大家好,我是老表~

本篇介绍机器学习众多算法里面最基础也是最“懒惰”的算法——KNN(k-nearest neighbor)。你知道为什么是最懒的吗?

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()函数
简说Python 2021第一波学习交流群入群开启,加微信:pythonbrief,回复:2021,即可加入。 入群规则: 1)本公众号留言总次数199+的读者可以直接添加好友进入; 2)2021年留言次数9+次的读者可以直接添加好友进入; 3)成功添加好友后,支付9.9元入群费用的读者可以直接进入(自动退群时会归还9.9元); 入群截止时间:2021.1.8 20:00 【注】设置入群规则主要是为了排除伸手党和推广营销的人,学习交流群不欢迎伸手党和推广者加入,一经发现直接清除、拉黑。 【最新投稿福利】 1>投稿规则:Java、前端、Python等方向的技术文章;内容不少于500字;可以是实战,也可以是欢快程序员类型,也可以是知识点科普;需要是首次发布在微信公众号平台,以原创发布,会注明作者及相关作者简介。 2>福利:按文章质量每1000字(不含代码)激励50-100元不等,投稿被采纳4次及以上者,可以另外获得赠书和简说编程专栏勋章,投稿越多,激励越多。 扫码,备注:投稿 学习更多: 整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了 

Read more

智能指针:告别内存泄漏的利器----《Hello C++ Wrold!》(27)--(C/C++)

智能指针:告别内存泄漏的利器----《Hello C++ Wrold!》(27)--(C/C++)

文章目录 * 前言 * 智能指针的作用 * 智能指针的实现和原理 * 库里面的智能指针 * std::auto_ptr * auto_ptr的模拟实现 * std::unique_ptr * unique_ptr的模拟实现 * std::shared_ptr * shared_ptr的模拟实现 * shared_ptr的一个弊端 * std::weak_ptr * weak_ptr的模拟实现 * 删除定制器 * 作业部分 前言 在 C++ 编程中,动态内存管理始终是开发者面临的核心挑战之一。手动使用new分配内存、delete释放内存的模式,不仅需要开发者时刻关注内存生命周期,更可能因疏忽导致内存泄漏(忘记调用delete)、二次释放(重复调用delete),或是在异常抛出时因执行流跳转跳过delete语句等问题 —— 这些隐患轻则导致程序性能退化,重则引发崩溃或不可预期的运行错误,成为项目中难以排查的 “隐形 bug”。 为解决这一痛点,C++ 标准库引入了智能指针这一核心工具。

By Ne0inhk
今天你学C++了吗?——map

今天你学C++了吗?——map

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥✨✨✨✨✨✨ 个人主页✨✨✨✨✨✨ 前面我们已经学习了set容器的使用,接下来我们来看看map容器有什么奇妙之处?准备好了吗~我们发车去探索C++的奥秘啦~🚗🚗🚗🚗🚗🚗 目录 什么是map? pair 什么是pair? pair的组成 pair的构造与初始化 pair的成员函数 pair的比较 编辑 pair的用途 map的构造 map的插入 编辑 operator[ ] at multimap equal_range equal_range、lower_bound和upper_bound简单对比 1. equal_range 2. lower_bound 3. upper_bound 对比与联系 C++中map和set容器的简单对比 什么是map?

By Ne0inhk
【C++】C++异常

【C++】C++异常

🎬 个人主页:MSTcheng · ZEEKLOG 🌱 代码仓库 :MSTcheng · Gitee 🔥 精选专栏: 《C语言》 《数据结构》 《算法学习》 《C++由浅入深》 💬座右铭:路虽远行则将至,事虽难做则必成! 在前面的文章中,我们已经介绍了C++11的一些新特性。本文将和下一篇一起为大家讲解C++的最后两个重要主题:异常处理和智能指针。 文章目录 * 一、异常的概念及使用 * 1.1异常的概念 * 1.2异常的分类 * 1.3异常的抛出与捕获 * 1.4栈展开 * 1.5 查找匹配的处理代码 * 1.6异常重新抛出 * 1.7异常的安全问题 * 1.8异常规范 * 二、总结 一、异常的概念及使用 1.1异常的概念 异常(Exception)是指在程序执行过程中发生的意外或错误情况,

By Ne0inhk