机器学习模型之KNN算法
1、KNN算法
KNN(K nearest neighbor)是一种分类算法,其根据需要预测的点的周围K个点的分类类别来决定当前点的类别。
2、K值选择和距离度量方法
一般来说,K值由用户自己设定,K值的选择会影响最终分类的效果。距离度量方法主要有欧式距离,曼哈顿距离
3、KD树
KD树是一种树形搜索结构。
3.1、构建KD树
KD树是一种二叉树,KD树的每个节点都表示一个对应的实例。其构建过程如下
input:输入的数据集\(T = {x_{1},x_{2},.....x_{N}}\),其中\(x_{i} = {x_{i}^{1},x_{i}^{2},.......x_{i}^{k}}\),这里的K和KNN的k的含义是不一样的,KNN的K是寻找最近的K个值,而这里的k指的是k维空间,也就是x向量的长度。
output:KD树。
- 开始
构造根节点,根节点中包括全部的数据T,我们首先从第一维数据\(x^{1}\)进行分割,找到\(x^{1}\)这个维度中中位数,并将这个数据作为根节点,对于第一维小于这个中位数的数据集我们放到左孩子节点,相反的,对于大于这个中位数的数据集我们放到右孩子节点 - 重复
接下来,我们重复上述操作,假设深度为j,那我们选择的维度就是$l = j % k + 1 \(,则我们选择第\)x^{l}$维作为切分维度 - 终止
直到每个节点都包含一个数据的时候,我们构建终止。
这里我们会发现,从根节点开始,第一层是对\(x^{1}\)的切分,第二层是对\(x^{2}\)的切分,以此类推,当切分到\(x^{k}\)之后,我们下一层切分\(x^{1}\)。
3.2、搜索KD树
input:已构造的KD树,输入点x
output:x的最近点
- 开始
从根节点开始,我们如同构造KD树一样,从跟节点到叶子节点,找到"最近的叶子节点"。这一步和二叉搜索树相类似。 - 回溯
我们找到的这个叶子节点不一定是最近的节点,我们定义r_min为这个叶子结点和当前点的距离,这个距离我们可以自己定,欧式也好曼哈顿也好。我们回溯到这个叶子节点的父节点,判断其另外一个孩子所在的超矩形区域是否和当前节点和"最近节点"有交集,判断的标准是这个孩子节点切分的维度和当前节点维度的值的差值是否大于r_min,如果大于,说明不想交,如果小于,说明相交,如果不想交,则继续向父节点回溯,如果相交,则判断这个孩子节点的其他孩子节点是否和当前节点是否相交,并计算距离,如果小于r_min则对r_min进行更新。 - 终止
回溯到根节点算法终止。最终r_min则为最近的距离,其所对应的点即为最近点。