k近邻算法既可以作为分类方法(离散的标签)也可以作为回归方法(连续标签)。考虑作为分类的时候,算法的输入为特征空间,输出为实例的类别。
基本思想:给定一个训练集,然后寻找其中与新输入的实例最近的 k k 个实例,将新实例标记为 k k 个实例中所属类别最多的一类。
其中的距离度量可以是任意的度量标准,K是一个用户自己定义的超参数。
k k 近邻算法实际就是划分特征空间。该模型的基本要素:距离的度量、K值的选择,分类决策规则。
常见的距离度量有:欧氏距离、曼哈顿距离、闵可夫斯基距离、契比雪夫距离。不同的距离度量计算出来的最近邻点是不相同的。
具体的内容可以参考:常用的相似性度量
K值的较小意味着模型的复杂度上升,容易过拟合;k值的增大意味着模型区域简单,容易欠拟合。实际应用中通常使用交叉验证法来选取最优的K值。
k近邻的分类决策规则往往是少数服从多数,即k个近邻实例中哪个类别的实例多就将新实例标记为哪类。
假设分类的损失函数为0-1损失函数,分类函数为:
最基本的近邻搜索就是通过暴力计算各个点对之间的距离:从 N N 个 D D 维的样本,这种算法的复杂度是 O(DN2) O ( D N 2 ) 。当样本点不算太多时,可以使用暴力计算;一旦样本点数目太多,则就不太适合使用暴力计算。
为了解决暴力计算对数据集样本点数目太多而不适用的问题,提出了许多基于树的数据结构来尝试解决这个问题。通常,这些结构都试图来减少距离计算的次数。例如:样本点A距离样本点B很远,而B距离样本点C又很近,因此可以得出结论样本点C距离样本点A很远,最关键的这之间不同计算它们之间距离的具体数值。
一个早期的利用这种信息聚合的方法是KD树(k-dimension tree), KD树是沿着数据集各个维度来划分参数空间,将其划分为多个正交区域的二叉树。KD树的构造生产所需的计算量并不大,计算非常快,因为它并不需要计算D维的距离。一旦KD树构建完成,样本点的最近邻点的计算复杂度只有 O(log(N)) O ( l o g ( N ) ) 。当样本点的维度不大于20的时候,KD树用于实现最近邻搜索的速度还算不错。但当维度继续增大的时候再一次变的不适用。
为了应对高维的问题,提出了球树的结构。KD树的划分数据是沿着笛卡尔坐标系,球树是在一系列的超球体里面划分数据。虽然这会提高构建球树时的计算量,但对于高维数据的使用确实非常有用的。
一个球树通过迭代地通过给出的中心 C C 和半径 r r ,因此每个样本点(树中的节点)都会落在一个有参数 (C,r) ( C , r ) 超球体中。最近邻候选点数目可以通过三角不等式来进行削减。
Reference:
[1]《统计学习方法》,李航.
[2]常用的相似性度量