基本概念
k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。
基本概念如下:存在一个样本数据集合,所有特征属性已知,并且样本集中每个对象都已知所属分类。对不知道分类的待测对象,将待测对象的每个特征属性与样本集中数据对应的特征属性进行比较,然后算法提取样本最相似对象(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的对象数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后根据这k个数据的特征和属性,判断待测数据的分类
即:一个样本与数据集中的k个样本最相似, 如果这k个样本中的大多数属于某一个类别, 则该样本也属于这个类别。
距离函数
曼哈顿距离(L1范数)
曼哈顿距离也叫”曼哈顿街区距离”。想象你在曼哈顿街道上,从一个十字路口开车到另一个十字路口,驾驶距离就是这个“曼哈顿距离”。
二维平面上两点a(x1,y1),b(x2,y2)a(x_1,y_1),b(x_2,y_2)a(x1,y1),b(x2,y2)之间的曼哈顿距离公式:
dab=∣x1−x2∣+∣y1−y2∣d_{a b}=\left|x_{1}-x_{2}\right|+\left|y_{1}-y_{2}\right| dab=∣x1−x2∣+∣y1−y2∣n维空间上两点a(x1,x2...xn),b(y1,y2...yn)a(x_1,x_2 ... x_n), b(y_1,y_2 ... y_n)a(x1,x2...xn),b(y1,y2...yn)的曼哈顿距离公式:
dab=∣x1−y1∣+∣x2−y2∣+…..+∣xn−yn∣d_{a b}=\left|x_{1}-y_{1}\right|+\left|x_{2}-y_{2}\right|+\ldots . .+\left|x_{n}-y_{n}\right| dab=∣x1−y1∣+∣x2−y2∣+…..+∣xn−yn∣
欧氏距离(L2范数)
二维平面上两点a(x1,y1),b(x2,y2)a(x_1,y_1),b(x_2,y_2)a(x1,y1),b(x2,y2)之间的欧氏距离公式:
dab=(x1−x2)2+(y1−y2)2d_{a b}=\sqrt{\left(x_{1}-x_{2}\right)^{2}+\left(y_{1}-y_{2}\right)^{2}} dab=(x1−x2)2+(y1−y2)2
n维空间上两点a(x1,x2...xn),b(y1,y2...yn)a(x_1,x_2 ... x_n), b(y_1,y_2 ... y_n)a(x1,x2...xn),b(y1,y2...yn)的欧氏距离公式:
dab=(x1−y1)2+(x2−y2)2+…+(xn−yn)2d_{a b}=\sqrt{\left(x_{1}-y_{1}\right)^{2}+\left(x_{2}-y_{2}\right)^{2}+\ldots+\left(x_{n}-y_{n}\right)^{2}} dab=(x1−y1)2+(x2−y2)2+…+(xn−yn)2
切比雪夫距离(∞\infin∞范数)
二维平面上两点a(x1,y1),b(x2,y2)a(x_1,y_1),b(x_2,y_2)a(x1,y1),b(x2,y2)之间的切比雪夫距离公式:
dab=max(∣x1−x2∣,∣y1−y2∣)d_{a b}=\max \left(\left|x_{1}-x_{2}\right|,\left|y_{1}-y_{2}\right|\right) dab=max(∣x1−x2∣,∣y1−y2∣)
n维空间上两点a(x1,x2...xn),b(y1,y2...yn)a(x_1,x_2 ... x_n), b(y_1,y_2 ... y_n)a(x1,x2...xn),b(y1,y2...yn)的切比雪夫距离公式:
dab=max(∣x1−y1∣,∣x2−y2∣,…∣xn−yn∣)d_{a b}=\max \left(\left|x_{1}-y_{1}\right|,\left|x_{2}-y_{2}\right|, \ldots\left|x_{n}-y_{n}\right|\right) dab=max(∣x1−y1∣,∣x2−y2∣,…∣xn−yn∣)
夹角余弦
二维平面上两点a(x1,y1),b(x2,y2)a(x_1,y_1),b(x_2,y_2)a(x1,y1),b(x2,y2)之间的夹角余弦公式:
cosΘ=x1∗x2+y1∗y2x12+y12∗x22+y22\cos \Theta=\frac{x_{1} * x_{2}+y_{1} * y_{2}}{\sqrt{x_{1}^{2}+y_{1}^{2}} * \sqrt{x_{2}^{2}+y_{2}^{2}}} cosΘ=x12+y12∗x22+y22x1∗x2+y1∗y2
n维空间上两点a(x1,x2...xn),b(y1,y2...yn)a(x_1,x_2 ... x_n), b(y_1,y_2 ... y_n)a(x1,x2...xn),b(y1,y2...yn)的夹角余弦公式:
cosΘ=x1∗y1+x2∗y2+…+xn∗ynx12+x22+…+xn2∗y12+y22+…+yn2\cos \Theta=\frac{x_{1} * y_{1}+x_{2} * y_{2}+\ldots+x_{n} * y_{n}}{\sqrt{x_{1}^{2}+x_{2}^{2}+\ldots+x_{n}^{2}} * \sqrt{y_{1}^{2}+y_{2}^{2}+\ldots+y_{n}^{2}}} cosΘ=x12+x22+…+xn2∗y12+y22+…+yn2x1∗y1+x2∗y2+…+xn∗yn
KD-Tree
由于KNN算法需要计算测试样本和训练样本中最近的K个样本,线性搜索的时间成本过大。因此,常用的搜索方法是KD-Tree,其基本原理类似二分搜索树(BST),只不过特征维度更高。示意图如下:
细节这里不讲,可以参考文献[1][2]。
sklearn中提供了KD-Tree的算法。
优缺点
优点
简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;可用于非线性分类可用于数值型数据和离散型数据(既可以用来估值,又可以用来分类)训练时间复杂度为O(n);无数据输入假定;对异常值不敏感。准确度高,对数据没有假设,对outlier不敏感;
缺点
计算复杂性高;空间复杂性高;需要大量的内存样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分。最大的缺点是无法给出数据的内在含义。