k近邻算法
KNN算法流程:
- 计算已知类别数据集中的点与当前点之间的距离。
- 按距离递增次序排序。
- 选取与当前点距离最小的k个点。
- 统计前k个点所在的类别出现的概率。
- 返回前k个点出现频率最高的类别作为当前点的预测分类。
k近邻算法api
import sklearn
sklearn.neighbors.KNeighborsClassifier(n_neighbors = s)
>>> n_neighbors:int,默认 = 5,表示查询默认使用的邻居数
距离度量
K值的选择
- K值过小:容易受到异常点的影响,容易过拟合
- K值过大:受到样本均衡的问题,容易欠拟合
kd树
k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离,计算并存储好以后,再查找k近邻,当训练集很大时,计算非常耗时。
为了提高KNN搜索效率,可以使用kd树训练数据,以减少计算距离的次数。
kd树搜索实现
kd树搜索过程:
- 二叉树搜索比较待查询节点和分裂节点的分裂维的值。(小于等于就进入左子树分支,大于就进入右子树分支知道叶子节点)
- 顺着搜索路径找到最近邻的近似点。
- 回溯搜索路径,并判断搜索路径上的节点的其他子节点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子节点空间中探索。
- 重复这个过程直到搜索路径为空。