机器学习原理及公式推导(三)k近邻法

        k k 近邻法( k k -nearest neighbor, k k -NN)是一种基本分类与回归方法,《统计学习方法》只讨论分类问题中的 k k 近邻法。 k k 近邻法假设给定一个训练数据集,其中的实例类别已定,分类时根据其 k k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。

1、 k k 近邻算法

       给定训练数据集
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) ,   , ( x N , y N ) } T=\{(x_1,y_1), (x_2,y_2),\cdots,(x_N,y_N)\}        在训练集 T T 中找出与 x x 最近邻的 k k 个点,涵盖这 k k 个点的 x x 的邻域记作 N k ( x ) N_k(x) ,根据以下规则决定 x x 的类别 y y
y = a r g min c j x i N k ( x ) I ( y i = c j ) , i = 1 , 2 ,   , N ; j = 1 , 2 ,   , K y=arg\min_{c_j}\sum_{x_i\in N_k(x)}I(y_i=c_j),i=1,2,\cdots,N;j=1,2,\cdots,K        式中,I为指示函数, Y = { c 1 , c 2 ,   , c K } Y=\{c_1,c_2,\cdots,c_K\} 是实例的类别。 k k 近邻法的特殊情况是 k = 1 k=1 的情形,成为最近邻算法。 k k 近邻法没有显式的学习过程。

2、 k k 近邻模型

        k k 近邻法中,任何一个新的输入实例,它所述的类唯一地确定。这相当于将特征空间划分为一些子空间,确定子空间里的每个点所属的类,每个子空间的类别是唯一确定的。
       特征空间中两个实例点的距离是两个实例点相似程度的反映,这个距离可以是欧式距离,也可以是更一般的 L p L_p 距离( L p L_p distance)或Minkowski距离(Minkowski distance)。
        x i x_i x j x_j L p L_p 距离定义为
L p ( x i , x j ) = ( l = 1 n x i ( l ) + x j ( l ) p ) 1 p L_p(x_i,x_j)=(\sum_{l=1}^n|x_i^{(l)}+x_j^{(l)}|^p)^{\frac{1}{p}}        当 p = 2 p=2 时,称为欧式距离(Euclidean distance);当 p = 1 p=1 时,称为曼哈顿距离(Manhattan distance);当 p = p=\infty 时,它是各个坐标距离的最大值,即
L ( x i , x j ) = max l x i ( l ) x j ( l ) L_\infty(x_i,x_j)=\max_l|x_i^{(l)}-x_j^{(l)}|         k k 值的选择会对结果产生重大影响。
       如果选择较小的 k k 值,相当于用较小的邻域进行预测,近似误差(approximation error)会减小,但估计误差(estimation error)会增大。换句话说, k k 值减小意味着模型变得复杂,容易发生过拟合。
       如果选择较大的 k k 值,估计误差减小,但近似误差增大,模型变得简单。在应用中, k k 值一般取一个比较小的数值,通常用交叉验证来选取最优 k k 值。
        k k 近邻法中的分类规则往往是多数表决。多数表决规则(majority voting rule)有如下解释:
       对给定的实例 x X x\in X ,其最近邻的 k k 个训练实例点构成集合 N k ( x ) N_k(x) ,若涵盖 N k ( x ) N_k(x) 区域的类别是 c j c_j ,那么误分类率是
1 k x i N k ( x ) I ( y i ̸ = c j ) \frac{1}{k}\sum_{x_i\in N_k(x)}I(y_i\not= c_j)        可以看到,多数表决规则等价于经验风险最小化。

3、 k k 近邻法的实现: k d kd

       当训练集很大时,如果要计算输入实例与每一个训练实例之间的距离,以确定 k k 个最近邻点,计算非常耗时,因此使用 k d kd 树结构存储训练数据,以减少计算距离的次数。
       构造 k d kd 树相当于不断用垂直于坐标轴的超平面将 k k 维空间切分,构成一系列的 k k 维超矩形区域, k d kd 树的每个结点对应于一个 k k 维超矩形区域。
       首先构造根节点,使其对应于包含所有实例点的超矩形区域;再通过递归方法,不断对 k k 维空间进行切分,生成子结点。通常依次选择坐标轴对空间切分,选择训练实例点在选定坐标轴上的中位数(median)为切分点,这样得到的 k d kd 树是平衡的。
       构造完 k d kd 树后,接着考虑如何进行搜索,以最近邻搜索为例。
       (一)首先找到包含目标点 x x 的叶结点:从根节点出发,递归向下访问 k d kd 树,若目标点 x x 当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点,直到子结点为叶结点。
       (二)暂时以此叶结点为“当前最近点”。
       (三)递归地向上回退,如果该结点保存的实例点比“当前最近点”距离目标点 x x 更近,则以该结点为“当前最近点”;检查“当前最近点”的父节点的另一子结点对应的区域是否有更近的点。
       (四)当回退到根节点时,搜索结束,最后的“当前最近点”即为 x x 的最近邻点。
        k d kd 树的平均计算复杂度是 O ( l o g N ) O(logN) N N 为训练实例数。 k d kd 树更适用于训练实例数远大于空间维数时的 k k 近邻搜索,当训练实例数接近空间维数时,它的效率会迅速下降,几乎接近线性扫描。

猜你喜欢

转载自blog.csdn.net/u013899126/article/details/89501153