K近邻
模型目的:规定一个训练数据集,对新输入的实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某一个类,就把该输入的实例分配给这个类。
模型的三要素
- 距离的度量:一般常用的是欧式距离,也有Lp距离等等
- K值得选择
- 分类决策规则的决定
距离的度量
Lp 距离: Lp(xi,xj)=[∑|x(l)i−x(l)j|p]1p
- 当p=1时,称为曼哈顿距离
- 当p=2时,称为欧式距离
- 当p=正无穷时,是各个坐标距离的最大值
K值得选择
- K值较大时,样本外误差会增大,容易发生过拟合
- K值较小时,样本内误差会增加
分类决策的规则
使用0-1损失函数进行多数表决
由此可以得出误分类的概率: P(Y≠f(x))=1−P(y=f(x))
对于给定的实例X,其最近邻的K个训练实例构成集合 Nk(X) ,涵盖 Nk(X) 的区域类别为 Cj ,那么误分类的概率为:
1k∑I(yi≠cj)=1−1k∑I(yi=Cj)
所以,实际上多数表决的分类决策规则等价于经验风险最小化,这样我们就找出了优化的函数。
实现K近邻时,主要考虑的问题是如何对训练数据进行快速K近邻搜索,为了提高K近邻搜索时的效率,可以考虑使用特殊的结构存储数据,即KD树。
KD树
对K维空间的实例点进行储存以便对其进行快速检索的二叉树型数据结构。相当的于不断地用垂直于坐标轴的超平面将K维空间切分,构成一系列K维超矩形区域,每一个结点对应一个区域。
KD树包括构建和搜索两个步骤
构建
对于K维空间数据集 T={x1,x2,...xn} ,其中每一个特征都对应 xi={x(1)i,x(2)i...x(T)i}
首先,构造根节点,对应于包含T的K维空间的超矩形区域,选择 x(1) 为坐标轴,以T中所有实例的 x(1) 坐标的中位数为切分点,将根节点对应的超矩形区域分为2个子区域。切分由通过切分点并与坐标轴 x(1) 垂直的超平面实现,将落在切分超平面上的实例点保存在根节点。
然后,重复进行切分,知道2个子区域没有实例时为止。
搜索
给定一个目标点,搜索其最近邻
原理:
- 找到包含目标点的叶结点
- 从该叶结点出发,依次退回到父结点
- 不断查找与目标点最近邻的结点,当确定不可能存在更近的结点时终止
步骤:
- 从根节点出发,递归地向下访问KD树,直到找到叶结点为止
- 这个叶结点就是“当前最近点”
递归地向上回退,对于每个结点:
- 如果该结点保存的实例点与当前最近点距离目标点更近,则该点为新的“当前最新点”
- 检查“当前最新点”另外一边的点的距离,即检查另一子节点对应的区域是否与以目标点为球心,以目标点与“当前最近点”见得距离为半径的球体相交,如果相交,则去另一边寻找“当前最近点”
- 当回退到根节点时,搜索结束,获得最终的“当前最近点”
如果实例点是随机分布的,KD树搜索的平均计算复杂度为O(logN)
KD树更适用于训练实例远大于样本空间维度的样本,当样本数接近样本维度时,KD树相比线性扫描并无优势。