《统计学习方法》第三章 K-means算法

K-means算法

K-means 的三个基本要素

  • k值
    k值小,近似误差(approximation error)会减小,但是估计误差(estimation error)会增大,模型更复杂,容易过拟合。
    通常采用交叉验证法选取最优的k值,通常较小。
  • 距离度量
    e.g.欧氏距离, Lp 距离,Minkowski距离
  • 分类决策规则
    e.g.多数表决(等价于经验风险最小化)

K-means算法实现——kd树

why

通过二叉树这种数据结构来存储训练数据,从而减少实例之间距离计算的次数,提高k近邻搜索的效率。
所有非叶子节点可以视作用一个超平面,把空间分区成两个半空间。节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。
注意这里的k是指k维空间,不是K-means里面的距离k
kd树更适用于训练集数量远大于空间维度数的情况

构造kd树

  1. 随着树的深度轮流选择轴当作分区面
    axis = depth mod k
    但是如果数据分布在各个维度不均匀(在一些维度方差较大,在另一些维度分布集中),更好的方法是最大方差法(max invarince),即每次我们选择维度进行划分时,都选择具有最大方差维度。
  2. 点由垂直分区面之轴座标的中位数(按顺序排列后位于中间位的那个数)区分并放入子树,落在切分超平面的点保存在结点。

利用kd树进行k近邻搜索

以 最近邻搜索 为例,k-d树最邻近搜索的过程如下:
1. 从根节点开始,递归的往下移。往左还是往右的决定方法与插入元素的方法一样(如果输入点在分区面的左边则进入左子节点,在右边则进入右子节点)。
2. 一旦移动到叶节点,将该节点当作”目前最佳点”。
3. 回溯(backtracing),对每个经过的节点运行下列步骤:
1)如果目前所在点比目前最佳点更靠近输入点,则将其变为目前最佳点。
2)检查另一边子树有没有更近的点(检查另一子树对应的超矩形区域是否与当前最近点和目标点距离为半径、目标点为球心的的超球体相交),如果有则从该节点往下查找,如果没有则回退
在实现中,我们可以有两种方式来求Q与树分支Branch之间的距离。第一种是在构造树的过程中,就记录下每个子树中包含的所有数据在该子树对应的维度k上的边界参数[min, max];第二种是在构造树的过程中,记录下每个子树所在的分割维度k和分割值m,(k, m),Q与子树的距离则为|Q(k) - m|。
4. 当回退到根节点,搜索完毕后完成最邻近搜索
在实例点随机分布的情况下,kd树搜索算法复杂度是O(logN)
kd树更适用于训练实力远多于空间维度的情况,但是实际运用中我们经常面对高维度的场景,这时可以选择优化算法——Kd-tree with BBF(Best Bin First),Kd-tree with BBF的核心优化思想是限制查找时进行回溯的次数上限

你可能感兴趣的:(读书笔记)