1. 综述html
Cover和Hart在1968年提出了最初的邻近算法,也被称为基于实例的学习或懒惰算法。
与决策树算法相比,处理训练集的时候并不创建任何模型,进行分类时才将测试样例和全部已知实例进行比较进而分类。
2. 例子算法
上图中主要有蓝色方块和红色三角两种色块,若是要对绿色未知圆点进行判断分类,那么它是属于蓝色方块仍是红色三角呢?ide
算法的思路:若是一个样本在特征空间中的K个最类似(即特征空间中最邻近)的样本中的大多数属于这一类别,则该样本也属于这个类别。学习
KNN算法通常能够分为两步:测试
上图中,若是咱们选择的K值为1,则离未知圆点最近的一个色块是蓝色,未知实例会被归类为蓝色。假设咱们选择的K值为4,很明显距离未知圆点最近的4个色块分别为:3个红色三角和1个蓝色方块,那么未知圆点就会被归类为红色三角(少数服从多数)。ui
因此K的选择对结果的影响很大,在必定范围内经过增大K能够加强抗噪性。idea
对于距离的衡量方式有不少种,例如Euclidean Distance,余弦值(cos),相关度 (correlation),曼哈顿距离 (Manhattan distance),最经常使用的是Euclidean distance: spa
二维的下距离计算公式如上图简单的数学公式,扩展到n维下x,y两点的距离公式:.net
注解:设n维空间两点的坐标:
Px(x1,x2,...,xn)
Py(y1,y2,...,yn)
那么Px、Py两点间距离(平方):
(x1-y1)^2+(x2-y2)^2+.+(xn-yn)^2htm
KNN算法虽然从原理上也依赖于极限原理,但在类别决策时,只于极少许的相邻样本有关。因为KNN算法主要依靠周围有限的邻近样本,而不是依靠判别类域的方法来肯定所属类别,所以对于类域的交叉或重叠较多的待分样本集来讲,KNN算法较其余算法更为适合。
KNN算法不只能够用于分类,还能够用于回归。经过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就能够获得该样本的属性。
不足一:须要大量的空间存储全部实例,以及计算量较大。由于对每个未知实例都要计算它到全部实例的距离,才能求得它的K个最近邻点。
解决方法:目前经常使用的解决方法是事先对已知样本点进行剪辑,
事先去除对分类做用不大的样本。这个解决方法比较适用于那些样本容量比较大的类域,而样本容量比较小的类域采用这种算法比较容易产生误分。
不足二:当其中一类样本过大,则无论未知实例属于哪一类,都很容易归为数量过大的这一类。
如图:
由于Y点在红色区域内,用肉眼去看很容易判断出它多半属于红色一类,可是由于蓝色过多,若K值选取稍大则很容易将其归为蓝色一类。为了改进这一点,能够为每一个点的距离增长一个权重,这样离得近的点能够获得更大的权重,好比距离d,权重1/d。
参考:http://www.cnblogs.com/kuihua/p/5883691.html