最近看了一下KNN相关内容,做下总结;大致过一下李航的书中KNN的讲解:统计学习方法中只讨论了分类K近邻法,先讲了KNN的算法流程,KNN的模型实际上是对特征空间做了一次划分,kd树中的每个节点对应了k维空间划分中的一个超矩形区域,KNN中用到了距离度量,使用的距离度量类型有Lp距离,这个明科夫斯基距离定义公式可以引申出曼哈顿距离,欧式距离和切比雪夫距离,随后讲到了K值的选择,过小则容易过拟合,过大则容易欠拟合,可以使用交叉验证法选取k值,最后KNN的分类决策规则采用的是多数表决法,这等价于经验风险最小化;随后讲到了如何使用kd树对数据进行快速的k近邻搜索,线性扫描过于耗时。构造kd树主要注意一个公式,l = j mod k + 1;l是特征的第l维度,j是kd树深度,l也是此深度对应的切分特征维度,kd树的搜索书中以最近邻法为例,K近邻基本差不多,注意递归搜索的想法,对于随机分布的数据,kd树搜索的平均复杂度为O(logN),kd树适用于训练实例数远大于空间维度的数据搜索,最后举了一个简单的最近邻kd树构造搜索的例子。
注:距离计算时特征维度可以设置权值,KNN回归预测时可以对不同的点设置权值
非常流畅简洁的一篇KNN总结,主要从sklearn的KNN原理出发,讲了sklearn的kd树和球树实现方式,对KNN的扩展以及优缺点做了简洁概括。
这篇文章比较多的提到了距离度量的不同方式,kd树的各种操作,不过依然是以k=1去举例,同时列举出了其它一些查找树结构。
这篇文章详细的介绍了kd树的构建和搜索流程,且K ≥ 1,不过文中的遍历思想先子节点后父节点再另一子节点的顺序稍有疑问,应该是中序遍历的思想才对,父节点放在最后才对。文中的例子很详细,可以在不明白的时候看看。
这篇文章承接上篇,对sklearn中的KNN包调用做了详细讲解。
这篇文章着重提到了特征归一化对于KNN结果的影响,一般采用特征归一化后的欧式距离作为距离度量,表述方式非常直白浅显,易懂。
承接上篇,列举了kd树在最好和最坏情形下的例子,同时列出了KNN的部分优缺点和改进方法。
KNN的python实现,顺带撸了一遍KNN和kd树的流程。
介绍了构造kd树时特征分割为何采用最大方差选取对应维度特征而非顺序选取特征的方式,同时提到了所求点与其它子空间距离的计算方式,很简单的一元减法,最后对基于BBF的近似查找方法进行介绍。
疑惑:Kd-Tree:数据只存放在叶子结点,而根结点和中间结点存放一些空间划分信息(例如划分维度、划分值)?
比较简短但较正式的介绍了kd树的构建和查询算法,疑惑时可以看下里面的伪代码。
主要是KNN的优缺点和优化方法。
《Machine Learning:Regression》课程第6章KNN-Regression & Kernel Regression & non-parametric问题集
对KNN做回归的一些问题解释