• k近邻算法


    输入:训练数据集T={(xi,yi)}i=1N, 其中xi为实例的特征向量,yi{c1,c2,...,ck},i=1,2,...,N,实例特征向量x,

    输出:实例x对应的类别y,

    1. 根据给定的距离度量,在T中寻找与x最近的k个点,涵盖这k个点的x的邻域记作Nk(x), 2. 在Nk(x)中根据分类决策规则决定x的类别

    y=argmaxcjxiNk(x)I(yi=cj),i=1,2,...,N;j=1,2,...,K

    如果k=1, 则对应的算法为最近邻算法,

  • 模型

    当训练集,距离度量,k值及分类决策规律确定下来后,对于任意的输入实例,它所属的类都是唯一确定的,这相当于把特征空间划分为一些子空间,

    k近邻法

  • k值选择

    如果k选的太小,则近似误差会减小,估计误差会变大,模型会变复杂,容易发生过拟合,容易受到噪声的干扰,

    如果k选的太大,则估计误差变小,但近似误差会增大,这样模型会变复杂,

  • 分类决策规则

    一般都是多数表决,

    多数表决的损失函数为0-1损失函数,分类函数为

    f:Rn{c1,c2,...,cn}

    如果对于输入的实例x, 其最临近的k个训练实例点构成的集合为Nk(x), 如果涵盖这个集合的类别为cj,则误分类率为

    1kxiNk(x)I(yicj)=11kxiNk(x)I(yi=cj)

    注意,这里的误分类率指的是一个样本的误分类率,而不是所有输入样本的误分类率

    多数表决规则等价于经验风险最小化,

  • kd树

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

    构造平衡kd树的算法如下,但平衡kd树不见得是最好的,


    输入:k维空间数据集T={x1,x2,...,xN}, 其中xi=(xi(1),xi(2),...,xi(k)),i=1,2,...,N

    输出: kd树

    1. 构造根节点,根节点对应包含T的k维空间,选择x(1)位坐标轴,以T中所有实例的x(1)坐标的中位数为切分点,切分由通过切分点并与坐标轴x(1)垂直的超平面实现,切分为两个子节点,左子节点中存放的是x(1)较小的子区域,右子节点存放的是x(1)较大的子区域,将落在切分超平面的实例点保存在根节点
    2. 重复,对于深度为j的节点,选择x(l)为切分的坐标轴,l=j mod k+1, 再次切分这这两个子区域,而后生成深度为j+1的左右子节点,同样,将落在切分超平面上实例点保存在该节点,

    3. 直到两个子区域没有实例存在停止,

    通俗易懂的说法是开始从第一维开始,选择大于中位数的放到右节点,小于中位数的放到左节点,而后选择第二维,分别对左右节点实施同样的操作,构造kd树,

    这里只介绍对于kd树如何进行最近邻搜索,k近邻也是一样的,实质上就是在找训练集中与x最临近的那个点,


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

    输出: x的最近邻

    1. 在kd树中找到包含x的叶节点,经过与树中节点的比较,目标点会落在某一个叶节点上,
    2. 定义此节点为最近点
    3. 递归的向上回退,在每个节点执行:
      1. 如果该节点保存的实例点比当前最近点距离目标点更近,则更新最近点为该实例点
      2. 检查该节点的父节点的另一个子节点是否存在更近的点,具体地,检查另一子节点对应的去榆中是否与以目标点为球心,以目标点与当前最近点的距离为半径的超球体相交,如果相交,则移动到另一节点,接着递归的完成最近邻搜索,如果不相交,则回退,
    4. 当回退到根节点时,搜索结束,最后的当前最近点为x的最近点,

相关文章: