1. KNN算法
K Nearest Neighbors 可用于分类问题,就是新样本和训练集的所有样本作对比,找出与之最接近的K个样本,统计最近的k个训练样本中所属类别计数最多的那个类,就是新样本的类。
该算法简单直观,但是每次查询都需要和所有样本进行比较,代价很大。一种优化方法是基于KD树的实现。
2. KD树
KD树是一个二叉树,表示对K维空间的一个划分,它的功能就是在高维空间下进行一个快速的最近邻查询。利用KD树可省去对大部分数据点的搜索,从而减少搜索的计算量。
2.1 KD树构建
构建KD树相当于不断地用垂直于坐标轴的超平面将K维空间进行划分,构成一系列的K维超矩形区域,KD树的每一个节点对应于一个K维超矩形区域。
通常依次选择坐标轴对空间进行切分,选择训练样本在选定坐标轴上的中位数为切分点,这样得到的KD树是平衡的。但是,平衡的KD树搜索时的效率未必是最优的。也有选择
熵最大的特征值进行切分,个人感觉这里更有理由,因为熵越大,说明样本在这一维度上信息越大,切分后效果会越好。
2.2 KD树搜索
记待查询点的样本点为Q,样本点为xi,样本维度为d,即xi = {a1, a2, ..., ad}
- 首先从根节点开始递归往下找到包含Q的叶子节点,每一层都是找对应的xi;
- 将这个叶子节点认为是当前的“近似最近点”;