k近邻法: k-nearest neighbor

KNN

k近邻算法既可以作为分类方法(离散的标签)也可以作为回归方法(连续标签)。考虑作为分类的时候,算法的输入为特征空间,输出为实例的类别。

基本思想:给定一个训练集,然后寻找其中与新输入的实例最近的 k k 个实例,将新实例标记为 k k 个实例中所属类别最多的一类。

其中的距离度量可以是任意的度量标准,K是一个用户自己定义的超参数。


K K 近邻模型

k k 近邻算法实际就是划分特征空间。该模型的基本要素:距离的度量、K值的选择,分类决策规则。

距离度量

常见的距离度量有:欧氏距离、曼哈顿距离、闵可夫斯基距离、契比雪夫距离。不同的距离度量计算出来的最近邻点是不相同的。
具体的内容可以参考:常用的相似性度量

k值选择

K值的较小意味着模型的复杂度上升,容易过拟合;k值的增大意味着模型区域简单,容易欠拟合。实际应用中通常使用交叉验证法来选取最优的K值。

分类决策规则

k近邻的分类决策规则往往是少数服从多数,即k个近邻实例中哪个类别的实例多就将新实例标记为哪类。
假设分类的损失函数为0-1损失函数,分类函数为:

f:Rn{c1,c2,,ck} f : R n → { c 1 , c 2 , ⋯ , c k }

那么误分类的概率为:
P(Yf(X))=1P(Y=f(X)) P ( Y ≠ f ( X ) ) = 1 − P ( Y = f ( X ) )

定义的损失函数为:
J=11kxiNk(x)I{yi=cj} J = 1 − 1 k ∑ x i ∈ N k ( x ) I { y i = c j }

根据最小化经验风险的原则,k近邻的多数表决规则等价于经验风险最小化。


实现

暴力计算

最基本的近邻搜索就是通过暴力计算各个点对之间的距离:从 N N D D 维的样本,这种算法的复杂度是 ODN2 O ( D N 2 ) 。当样本点不算太多时,可以使用暴力计算;一旦样本点数目太多,则就不太适合使用暴力计算。

K-D树

为了解决暴力计算对数据集样本点数目太多而不适用的问题,提出了许多基于树的数据结构来尝试解决这个问题。通常,这些结构都试图来减少距离计算的次数。例如:样本点A距离样本点B很远,而B距离样本点C又很近,因此可以得出结论样本点C距离样本点A很远,最关键的这之间不同计算它们之间距离的具体数值。

一个早期的利用这种信息聚合的方法是KD树(k-dimension tree), KD树是沿着数据集各个维度来划分参数空间,将其划分为多个正交区域的二叉树。KD树的构造生产所需的计算量并不大,计算非常快,因为它并不需要计算D维的距离。一旦KD树构建完成,样本点的最近邻点的计算复杂度只有 O(log(N)) O ( l o g ( N ) ) 。当样本点的维度不大于20的时候,KD树用于实现最近邻搜索的速度还算不错。但当维度继续增大的时候再一次变的不适用。

球树(ball tree)

为了应对高维的问题,提出了球树的结构。KD树的划分数据是沿着笛卡尔坐标系,球树是在一系列的超球体里面划分数据。虽然这会提高构建球树时的计算量,但对于高维数据的使用确实非常有用的。

一个球树通过迭代地通过给出的中心 C C 和半径 r r ,因此每个样本点(树中的节点)都会落在一个有参数 (C,r) ( C , r ) 超球体中。最近邻候选点数目可以通过三角不等式来进行削减。

|x+y|<|x|+|y| | x + y | < | x | + | y |


Reference:
[1]《统计学习方法》,李航.
[2]常用的相似性度量

你可能感兴趣的:(机器学习)