程一舰
数据技术处
K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。KNN是通过测量不同特征值之间的距离进行分类。其基本思想可以用这样一句俗语来解释——“近朱者赤,近墨者黑”。
一、原理介绍K近邻的思路是如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。通过下面的这张图就好理解了:如果要确定绿点属于哪个颜色(红色或者蓝色),要做的就是选出距离目标点距离最近的k个点,看这k个点的大多数颜色是什么颜色。当k取3的时候,我们可以看出距离最近的三个,分别是红色、红色、蓝色,因此得到目标点为红色。二、算法步骤
K紧邻分类主要分为以下几个步骤:
1)计算测试数据与各个训练数据之间的距离;2)按照距离的递增关系进行排序;3)选取距离最小的K个点;4)确定前K个点所在类别的出现频率;5)返回前K个点中出现频率最高的类别作为测试数据的预测分类三、实例说明下面用一个经过改造了的Peter Harrington的《机器学习实战》中电影分类的例子(当然实际情况不可能这么简单)来说明该算法的用法。第一步:准备下电影分类数据集(电影名称与分类来自于优酷网;镜头数量则纯属虚构):上面数据集中序号1-12为已知的电影分类,分为喜剧片、动作片、爱情片三个种类,使用的特征值分别为搞笑镜头、打斗镜头、拥抱镜头的数量。那么来了一部新电影《唐人街探案》,它属于上述3个电影分类中的哪个类型?用KNN是怎么做的呢?首先,我们构建一个已分好类的数据集。对于一个规模巨大的数据集,显然数据库是更好的选择。这里为了方便验证,使用Python的字典dict构造数据集。第二步:计算一个新样本与数据集中所有数据的距离。这里的新样本就是:"唐人街探案": [23, 3, 17, "?片"]。欧式距离是一个非常简单又最常用的距离计算方法。其中x,y为2个样本,n为维度,xi,yi为x,y第i个维度上的特征值。如x为:"唐人街探案": [23, 3, 17, "?片"],y为:"伦敦陷落": [2, 3, 55, "动作片"],则两者之间的距离为:下面为求与数据集中所有数据的距离代码:第三步:按照距离大小进行递增排序。KNN.sort(key=lambda dis: dis[1])输出结果:第四步:选取距离最小的*k**个样本。*这里取k=5;KNN=KNN[:5]输出:[['我的特工爷爷', 17.49], ['美人鱼', 18.55], ['功夫熊猫3', 21.47], ['宝贝当家', 23.43], ['澳门风云3', 32.14]]第五步:确定前*k**个样本所在类别出现的频率,并输出出现频率最高的类别。*输出结果:[('喜剧片', 4), ('动作片', 1), ('爱情片', 0)]喜剧片四、总结KNN算法是最简单有效的分类算法,简单且容易实现。当训练数据集很大时,需要大量的存储空间,而且需要计算待测样本和训练数据集中所有样本的距离,所以非常耗时。KNN对于随机分布的数据集分类效果较差,对于类内间距小,类间间距大的数据集分类效果好,而且对于边界不规则的数据效果好于线性分类器。KNN对于样本不均衡的数据效果不好,需要进行改进。改进的方法时对k个近邻数据赋予权重,比如距离测试样本越近,权重越大。KNN很耗时,时间复杂度为O(n),一般适用于样本数较少的数据集,当数据量大时,可以将数据以树的形式呈现,能提高速度,常用的有kd-tree和ball-tree。大数据平台将一如既往的为各种数据挖掘类应用提供算力支持,为我行金融科技发展打造坚持的大数据平台支撑。