KNN算法简介
2016-04-01 17:05
218 查看
KNN(k-nearest neighbor)是一个简单而经典的机器学习分类算法,通过度量”待分类数据”和”类别已知的样本”的距离(通常是欧氏距离)对样本进行分类。
这话说得有些绕口,且来分解一番:
(1)分类问题都是监督(supervised)问题,也就是说一定数量的样本类别是已知的。
(2)既然我们已经有了一批分好类的样本,那么接下来的工作自然应该是通过已知样本训练分类器(通过调节分类器的参数,使分类器能够正确对训练样本分类),把分类器训练好以后用于对未知样本的分类(或类别预测)。
看上去就是这么回事,问题的关键在于分类器的训练。
但对于KNN分类器来说,事情并不是这个样子的。其实KNN并没有这么复杂。因为KNN并没有什么参数要调,换句话说,KNN其实并不需要训练!
作为最简单也最好理解的分类器,KNN只是假设数据都分布在欧式的特征空间内(以特征值为坐标区分不同样本的空间),然后我们恰好又知道全部数据在这个空间中的位置以及其中一部分数据的类别。那么现在我们怎么判断剩余那些数据的类别呢?
为了让分类进行下去,这里其实我们假设:空间中距离越近的点属于一类的可能性越大。
有了这条“公理”,那事情就好办多了。我们只需要计算每个待分类数据到全部已知类别数据的距离就好了。如图:
有正方形和三角形两个已知类,假如中间的圆形我们不知道它到底是三角形还是正方形。按照上面说的,我们可以正儿八经计算一下它到其他所有点的距离。在这里为了简便,我们目测一下发现它离旁边的三角形最近,好嘞,那么我们就把它归为三角形一类的。
注意这里我们把未知点和离它最近的那一个点归为一类。这样的分类器,准确来说叫最近邻分类器(nearest-neighbor,NN)。这是KNN的特殊情况,是K=1的情况。
那么K近邻,顾名思义,就是要一个未知点参考离它最近的前k个一直类别的点,看在这k个点里面,属于哪个类别的点最多,就认为未知点属于哪一类。还是上面的图,以圆形未知点为圆心,在实线画出的圆中,相当于k=3,也就是选了前三个离得最近的点,其中三角形2个,方形1个,所以未知点归到三角形一类。但是当考虑虚线范围内时,也就是k=5时,我们发现方形3个,三角形2个,所以这个时候未知点归到方形一类了。
所以我们可以发现,不同的最近邻个数往往会导致不同的分类结果,一般来说,我们在实际应用中要根据实际情况和经验确定k的取值。
算法流程
对每一个未知点执行:
计算未知点到所有已知类别点的距离
按距离排序(升序)
选取其中前k个与未知点离得最近的点
统计k个点中各个类别的个数
上述k个点里类别出现频率最高的作为未知点的类别
优缺点
优点:
简单有效、易理解
缺点:
k近邻需要保存全部数据集,因此对内存消耗大,当数据集较大时对设备要求非常高;
需要计算每个未知点到全部已知点的距离,可能会很耗时;
分类结果不易理解
这话说得有些绕口,且来分解一番:
(1)分类问题都是监督(supervised)问题,也就是说一定数量的样本类别是已知的。
(2)既然我们已经有了一批分好类的样本,那么接下来的工作自然应该是通过已知样本训练分类器(通过调节分类器的参数,使分类器能够正确对训练样本分类),把分类器训练好以后用于对未知样本的分类(或类别预测)。
看上去就是这么回事,问题的关键在于分类器的训练。
但对于KNN分类器来说,事情并不是这个样子的。其实KNN并没有这么复杂。因为KNN并没有什么参数要调,换句话说,KNN其实并不需要训练!
作为最简单也最好理解的分类器,KNN只是假设数据都分布在欧式的特征空间内(以特征值为坐标区分不同样本的空间),然后我们恰好又知道全部数据在这个空间中的位置以及其中一部分数据的类别。那么现在我们怎么判断剩余那些数据的类别呢?
为了让分类进行下去,这里其实我们假设:空间中距离越近的点属于一类的可能性越大。
有了这条“公理”,那事情就好办多了。我们只需要计算每个待分类数据到全部已知类别数据的距离就好了。如图:
有正方形和三角形两个已知类,假如中间的圆形我们不知道它到底是三角形还是正方形。按照上面说的,我们可以正儿八经计算一下它到其他所有点的距离。在这里为了简便,我们目测一下发现它离旁边的三角形最近,好嘞,那么我们就把它归为三角形一类的。
注意这里我们把未知点和离它最近的那一个点归为一类。这样的分类器,准确来说叫最近邻分类器(nearest-neighbor,NN)。这是KNN的特殊情况,是K=1的情况。
那么K近邻,顾名思义,就是要一个未知点参考离它最近的前k个一直类别的点,看在这k个点里面,属于哪个类别的点最多,就认为未知点属于哪一类。还是上面的图,以圆形未知点为圆心,在实线画出的圆中,相当于k=3,也就是选了前三个离得最近的点,其中三角形2个,方形1个,所以未知点归到三角形一类。但是当考虑虚线范围内时,也就是k=5时,我们发现方形3个,三角形2个,所以这个时候未知点归到方形一类了。
所以我们可以发现,不同的最近邻个数往往会导致不同的分类结果,一般来说,我们在实际应用中要根据实际情况和经验确定k的取值。
算法流程
对每一个未知点执行:
计算未知点到所有已知类别点的距离
按距离排序(升序)
选取其中前k个与未知点离得最近的点
统计k个点中各个类别的个数
上述k个点里类别出现频率最高的作为未知点的类别
优缺点
优点:
简单有效、易理解
缺点:
k近邻需要保存全部数据集,因此对内存消耗大,当数据集较大时对设备要求非常高;
需要计算每个未知点到全部已知点的距离,可能会很耗时;
分类结果不易理解
相关文章推荐
- 用Python从零实现贝叶斯分类器的机器学习的教程
- My Machine Learning
- 机器学习---学习首页 3ff0
- 反向传播(Backpropagation)算法的数学原理
- 也谈 机器学习到底有没有用 ?
- 如何用70行代码实现深度神经网络算法
- 量子计算机编程原理简介 和 机器学习
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)
- 已经证实提高机器学习模型准确率的八大方法
- 初识机器学习算法有哪些?
- 机器学习相关的库和工具
- 10个关于人工智能和机器学习的有趣开源项目
- 机器学习实践中应避免的7种常见错误
- 机器学习书单
- 北美常用的机器学习/自然语言处理/语音处理经典书籍
- 如何提升COBOL系统代码分析效率
- 自动编程体系设想(一)
- 自动编程体系设想(一)
- 支持向量机(SVM)算法概述
- [Ng机器学习公开课1]机器学习概述