前言
初学者接触机器学习难以入门的原因有以下几点:
①资料解释不全,尤其是公式符号没有给出定义,导致读者雾里看花。
②资料有误,论坛上部分帖子是发布者简单搬运,甚至有部分错误。
③实践性不足,没有合理引导读者进行代码实现。
笔者结合自己学习过程的痛点,将学习笔记分享出来。每篇文章力求短小精悍。
学习笔记包括以下六个模块:
算法描述:具象化描述算法,表达该算法的思想。
知识储备:此处会列出算法中使用到的小概念以帮助非理工科背景读者理解。
举个例子:此处会使用简单的数据并结合算法让读者深入理解细节。
实现代码:此处分为debug版本代码和第三方库实现代码。
算法分析:说明算法优缺点及适用场景。
资料引用:笔者学习过程中觉得干货满满的帖子作为补充资料。
笔者基于以下学习材料进行整理
①《机器学习实战》-作者: Peter Harrington-译者: 李锐 / 李鹏 / 曲亚东 / 王斌
此书提供python代码及简要阐明算法基本逻辑,大部分实现demon都源于此处。
②《机器学习中的数学》-作者: 孙博
此书简要阐明算法涉及的数学知识并给出实例介绍。
③b站硬核阿婆主手推各种算法原理可作为资料二的扩充。[3]
④《统计学习方法》-李航
算法描述
1.kNN思想包括近朱者赤近墨者黑和少数服从多数两大基本原则。
2.问题假设:我想探究一个小朋友的交友偏好,是喜欢跟男孩子玩还是喜欢跟女孩子玩。
3.数据输入:在某一时刻,目标小朋友的坐标位置与其他小伙伴的坐标位置。
4.算法过程:
①计算目标小朋友与其他小朋友的亲疏远近(距离)。
②按照由近及远的原则对距离排序。
③选出前k个最亲密的小朋友。
④统计这k个小朋友的性别(标签)并按照少数服从多数的原则得出结果。
知识储备
1.监督学习和无监督学习;两者的区别就是数据集是否有标签,有标签则为监督学习。在上面例子中,小伙伴的性别就是标签,所以此处为监督学习。
2.欧氏距离;两点之间的绝对距离。
假设二维空间有两个点A(1,2)和B(4,6)
则A和B的欧氏距离:
举个栗子
1.若目标小朋友坐标(3,0),其余小朋友位置如下表格
Data | 坐标 | 标签 |
---|---|---|
① | (0,0) | 女 |
② | (1,0) | 女 |
③ | (0,1) | 女 |
④ | (3, 3) | 男 |
⑤ | (3,4) | 男 |
⑥ | (4,3) | 男 |
2.计算目标小朋友和其他小伙伴的欧氏距离。
注:计算距离的方法有许多,此处仅以欧式距离举例。
3.对距离按照由近到远排序。(近朱者赤近墨者黑)
②<①=④<③=⑥<⑤
4.若k取5,则前5个小伙伴的投票结果为男生2票和女生3票,女生胜出。(少数服从多数)
实现代码
1.debug代码引用《机器学习实战》提供的demon,此书作者提供完整代码和数据集,强烈推荐。[1]
2.sklearn实现版本。[2]
算法分析
1.计算复杂;每预测一次都需要计算该数据与其他所有数据的距离并排序。
2.在debug代码有一个autoNorm函数,该函数的作用的对数据进行归一化。我们仍然以上述数据集为例,若坐标x的取值范围在[0,1],y的取值范围在[0,1000],则在计算距离的时候发现,坐标y的数值大小基本决定距离的大小,但实际情况中,我们认为x和y的重要性是等价的,所以这个时候需要归一化来磨平数值大小带来的差异。
3.
①k值的选取首先排除偶数,否则在投票时出现同票,无法满足少数服从多数。
②若标签有n个类,k的取值应大于等于n+1,原因是防止极端情况下每个类别各得一票,同样不满足少数服从多数的原则。
③关于更多k值大小的选取,笔者推荐阅读[4]中的k值选择。
资料引用
[1]GitHub:https://github.com/wzy6642/Machine-Learning-in-Action-Python3/tree/master/kNN_Project1
[2]CSDN:https://blog.csdn.net/weixin_37763870/article/details/105160899
[3]Bilibili:https://www.bilibili.com/video/BV1aE411o7qd
[4]CSDN:https://blog.csdn.net/sinat_30353259/article/details/80901746
此算法笔记会在CSDN、知乎、b站及公众号同步更新,账号名为一枚嘉应子。转载注明出处,侵权必究。