统计学习方法——第3章 k近邻法(个人笔记)
参考《统计学习方法》(第二版)李航
3.1 k近邻算法
定义:给定一个训练数据集,对新输入的实例,在训练数据集中找到与该实例最邻近的k个实例,在这k个实例,多数属于某个类别,就把该输入实例划分为这个类别。
算法3.1:
输入:训练数据集
输出:实例所属的类
(1)根据给定的距离度量,在训练集T中找出与最邻近的k个点,涵盖这k个点的的邻域记作;
(2)在中根据分类决策规则决定的类别:
其中,I为指示函数,即当是,I=1,否则,I=0。
当k=1时,称为最近邻算法。
3.2 k近邻模型
3.2.1 模型
模型由三个基本要素——距离度量、k值的选择和分类决策规则决定。
3.2.2 距离度量
的距离定义为
当p=2时,称为欧式距离,即
当p=1时,称为曼哈顿距离,即
当时,为各个坐标距离的最大值,即
3.2.3 k值的选择
当选择较小的k值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近的训练实例才会对预测结果起作用。但缺点是“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感。如果邻近的实例点是噪声,预测就会出错。换句话说,k值的减小意味着整体模型变得复杂,容易发生过拟合。
当选择较大的k值,就相当于用较大的邻域中的训练实例进行预测,优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时与输入实例较远的训练实例也会对预测起作用,使预测发生错误。k值的增大就意味着整体模型变得简单。
在应用中一般选取较小的数值,通常采用交叉验证法来选取最优的k值。
3.2.4 分类决策规则
分类决策规则往往是多数表决,即由输入实例的k个邻近的训练实例中的多数类决定输入实例的类。
若分类的损失函数为0-1损失函数,分类函数为
那么误分类的概率是
对给定的实例x,其最近邻的k个训练实例点构成集合为。
如果涵盖的区域为,那么误分类率为
要使误分类率最小即经验风险最小,就要使最大。
3.3 k近邻法的实现:kd树
为了提高k近邻搜索的效率,考虑使用特殊的结构存储训练数据,以减少计算距离的次数。
kd树就是其中一种。
3.3.1 构造kd树
kd树就是二叉树,表示对k维空间的划分。
构造kd树相当于不断用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。
算法3.2 (构造平衡kd树)
输入:k维空间数据集,其中。
输出:kd树。
(1)开始:构造根节点,根节点对应包含T的k维空间的超矩形区域。
选择为坐标轴,以T中所有实例的坐标的中位数为切分点,将根节点对应的超矩形区域切分为两个子区域。 切分通过由通过切分点并与坐标轴垂直的超平面实现。
由根节点生成深度为1的左、右子节点:左子节点对应坐标小于切分点的子区域,右子节点对应坐标 大于切分点的子区域。
将落在切分超平面上的实例点保存在根节点。
(2)重复:对深度为j的节点,选择为切分的坐标轴,,以该节点的区域中所有实例的坐标的中位数为切分点,将该节点对应的超矩形区域切分为两个子区域。 切分通过由通过切分点并与坐标轴垂直的超平面实现。
由该节点生成深度为j+1的左、右子节点:左子节点对应坐标小于切分点的子区域,右子节点对应坐标 大于切分点的子区域。
将落在切分超平面上的实例点保存在该节点。
(3)直到两个子区域没有实例存在时停止。从而形成kd树的区域划分。
例子,
3.3.2 搜索kd树
算法3.3 (用kd树的最近邻搜索)
输入:已构造的kd树,目标点x;
输出:x的最近邻
(1)在kd树中找出包含目标点x的叶节点:从根节点出发,递归向下访问kd树。若目标点x当前维的坐标小于切分点的坐标,则移动到左子节点,否则移动到右子节点。直到子节点为叶节点为止。
(2)以此叶节点为“当前最近点”。
(3)递归向上回退,在每个节点进行以下操作:
(a)如果该节点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”。
(b)当前最近点一定存在于该节点一个子节点对应的区域。检查该子节点的父节点的另一子节点对应区域是否有更近的点。具体地,检查另一子节点对应的区域是否以目标点为球心,以目标点与“当前最近点”间的距离为半径的超球体相交。
如果相交,可能在另一子节点对应的区域存在距离目标点更近的点,移动到另一个子节点。接着,递归地进行最近邻搜索;
如果不相交,向上回退。
(4)回退到根节点,搜索结束。最后的“当前最近点”即为x的最近邻点。
例子