统计学习方法——第3章 k近邻法(个人笔记)

统计学习方法——第3章 k近邻法(个人笔记)

参考《统计学习方法》(第二版)李航

3.1 k近邻算法

定义:给定一个训练数据集,对新输入的实例,在训练数据集中找到与该实例最邻近的k个实例,在这k个实例,多数属于某个类别,就把该输入实例划分为这个类别。

算法3.1:

输入:训练数据集

T=\left \{ (x_1,y_1),\cdots ,(x_N,y_N) \right \}

输出:实例x所属的类y

(1)根据给定的距离度量,在训练集T中找出与x最邻近的k个点,涵盖这k个点的x的邻域记作N_k(x);

(2)在N_k(x)中根据分类决策规则决定x的类别y

y=\arg\max_{c_j} \sum_{x_i}I(y_i=c_j),i=1,\cdots ,N ;j=1,\cdots ,K

其中,I为指示函数,即当y_i=c_j是,I=1,否则,I=0。

当k=1时,称为最近邻算法。

3.2 k近邻模型

 3.2.1 模型

模型由三个基本要素——距离度量、k值的选择和分类决策规则决定。

3.2.2 距离度量

x_i,x_jL_p距离定义为

L_p(x_i,x_j)=\left (\sum_{l=1}^{n}\left | x_i^{(l)}-x_j^{(l)} \right |^p \right )^{\frac{1}{p}}

当p=2时,称为欧式距离,即

L_2(x_i,x_j)=\left (\sum_{l=1}^{n}\left | x_i^{(l)}-x_j^{(l)} \right |^2 \right )^{\frac{1}{2}}

当p=1时,称为曼哈顿距离,即

L_1(x_i,x_j)=\sum_{l=1}^{n}\left | x_i^{(l)}-x_j^{(l)} \right |

p=\infty时,为各个坐标距离的最大值,即

L_\infty(x_i,x_j)=\max_{l}\left | x_i^{(l)}-x_j^{(l)} \right |

3.2.3 k值的选择

        当选择较小的k值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近的训练实例才会对预测结果起作用。但缺点是“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感。如果邻近的实例点是噪声,预测就会出错。换句话说,k值的减小意味着整体模型变得复杂,容易发生过拟合。

        当选择较大的k值,就相当于用较大的邻域中的训练实例进行预测,优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时与输入实例较远的训练实例也会对预测起作用,使预测发生错误。k值的增大就意味着整体模型变得简单。

        在应用中一般选取较小的数值,通常采用交叉验证法来选取最优的k值。

3.2.4 分类决策规则

分类决策规则往往是多数表决,即由输入实例的k个邻近的训练实例中的多数类决定输入实例的类。

若分类的损失函数为0-1损失函数,分类函数为

f:R^n\rightarrow \left \{ c_1,c_2,\cdots ,c_K \right \}

那么误分类的概率是

P(Y\neq f(X))=1-P(Y=f(X))

对给定的实例x,其最近邻的k个训练实例点构成集合为N_k(x)

如果涵盖N_k(x)的区域为c_j,那么误分类率为

\frac{1}{k}\sum_{x_i}I(y_i\neq c_j)=1-\frac{1}{k}\sum_{x_i}I(y_i= c_j)

要使误分类率最小即经验风险最小,就要使\sum_{x_i}I(y_i= c_j)最大。

3.3 k近邻法的实现:kd树

为了提高k近邻搜索的效率,考虑使用特殊的结构存储训练数据,以减少计算距离的次数。

kd树就是其中一种。

3.3.1 构造kd树

kd树就是二叉树,表示对k维空间的划分。

构造kd树相当于不断用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。

算法3.2 (构造平衡kd树)

输入:k维空间数据集T=\left \{ x_1,\cdots,x_N \right \},其中x_i=(x_i^{(1)},\dots,x_i^{(k)})

输出:kd树。

(1)开始:构造根节点,根节点对应包含T的k维空间的超矩形区域。

选择x^{(1)}为坐标轴,以T中所有实例的x^{(1)}坐标的中位数为切分点,将根节点对应的超矩形区域切分为两个子区域。 切分通过由通过切分点并与坐标轴x^{(1)}垂直的超平面实现。

由根节点生成深度为1的左、右子节点:左子节点对应坐标x^{(1)}小于切分点的子区域,右子节点对应坐标x^{(1)} 大于切分点的子区域。

将落在切分超平面上的实例点保存在根节点。

(2)重复:对深度为j的节点,选择x^{(l)}为切分的坐标轴,l=j(\mod k)+1,以该节点的区域中所有实例的x^{(l)}坐标的中位数为切分点,将该节点对应的超矩形区域切分为两个子区域。 切分通过由通过切分点并与坐标轴x^{(l)}垂直的超平面实现。

由该节点生成深度为j+1的左、右子节点:左子节点对应坐标x^{(l)}小于切分点的子区域,右子节点对应坐标x^{(l)} 大于切分点的子区域。

将落在切分超平面上的实例点保存在该节点。

(3)直到两个子区域没有实例存在时停止。从而形成kd树的区域划分。

例子,

 3.3.2 搜索kd树

算法3.3 (用kd树的最近邻搜索)

输入:已构造的kd树,目标点x;

输出:x的最近邻

(1)在kd树中找出包含目标点x的叶节点:从根节点出发,递归向下访问kd树。若目标点x当前维的坐标小于切分点的坐标,则移动到左子节点,否则移动到右子节点。直到子节点为叶节点为止。

(2)以此叶节点为“当前最近点”。

(3)递归向上回退,在每个节点进行以下操作:

        (a)如果该节点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”。

        (b)当前最近点一定存在于该节点一个子节点对应的区域。检查该子节点的父节点的另一子节点对应区域是否有更近的点。具体地,检查另一子节点对应的区域是否以目标点为球心,以目标点与“当前最近点”间的距离为半径的超球体相交。

        如果相交,可能在另一子节点对应的区域存在距离目标点更近的点,移动到另一个子节点。接着,递归地进行最近邻搜索;

        如果不相交,向上回退。

(4)回退到根节点,搜索结束。最后的“当前最近点”即为x的最近邻点。

例子

猜你喜欢

转载自blog.csdn.net/pk296256948/article/details/123966125
今日推荐