算法思想
给定一个训练数据集,对于新的输入实例,在数据集中找到与该实例最邻近的k个实例,这k个实例多数属于哪一类,就把该输入实例分为这个类。
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
模型
三要素:k值选择,距离度量,分类决策规则
k值选择:应用中k值一般取一个比较小的数值,通常采用交叉验证选取最优的k值。
距离度量:lp距离,欧氏距离(p=2),曼哈顿距离(p=1),切比雪夫距离(p=无穷)
分类决策规则:多数表决
实现
特征维数大及训练数据容量大时,可以使用特殊的结构存储训练数据,以减少计算距离的次数。比如kd树。
1.kd树的构造
(1)构造根节点,选择第一维坐标中位数的位置(根节点)为切分点,将该维度分为两部分。
(2)下一维度切割。
(3)所有点切分完毕停止。
tip:切割维度的选择可以使用方差,选择方差大的维度进行切割。网址:https://blog.csdn.net/carryheart/article/details/78142283
2.kd树搜索 原文:https://blog.csdn.net/losteng/article/details/50893739
从root节点开始,DFS搜索直到叶子节点,同时在stack中顺序存储已经访问的节点。
如果搜索到叶子节点,当前的叶子节点被设为最近邻节点。
然后通过stack回溯:
如果当前点的距离比最近邻点距离近,更新最近邻节点.
然后检查以最近距离为半径的圆是否和父节点的超平面相交.
如果相交,则必须到父节点的另外一侧,用同样的DFS搜索法,开始检查最近邻节点。
如果不相交,则继续往上回溯,而父节点的另一侧子节点都被淘汰,不再考虑的范围中.
当搜索回到root节点时,搜索完成,得到最近邻节点。