KNN(K-nearest neighbors) 既可用于分类,也可用于回归。
- 分类预测时,多数表决法,取决于与预测的样本距离最近的k个样本的特征,少数服从多数。
- 回归时,平均法,将与预测样本距离最近的k个样本的特征进行平均。
KNN算法三要素
k值的选取、距离度量方式和分类决策规则
算法一:暴力算法
计算所有样本与预测样本之间的距离,选取其中距离最小的k个,用于分类或回归。
算法二:KD树
一、生成kd树
所有m个样本一共有n个特征值,针对每个特征计算m个样本的方差,选取方差最大的特征,将此特征中处于中位数位置的样本放入根节点,该特征小于中位数的是左子树,大于中位数的是右子树,然后针对左子树和右子树,继续上述过程,最后生成递归的kd树。
二、搜索最近邻
对于一个目标点,从根节点开始在KD树里面找到包含目标点的叶子节点。以目标点为圆心,以目标点到叶子节点样本实例的距离为半径,得到一个超球体,最近邻的点一定在这个超球体内部。然后返回叶子节点的父节点,检查目标点到该父节点的距离是否缩短,若是,则以这个距离为半径更新原有半径,否则,不予变动。再检查这个父节点的另一个子节点包含的超矩形体是否和超球体相交,如果相交就到这个子节点寻找是否有更加近的近邻,若有就更新最近邻。如果不相交就直接返回父节点的父节点,看这个父节点的另一个子树是否与原超球体相交,若相交,检查是否存在更近的近邻。当回溯到根节点时,算法结束,此时保存的最近邻节点就是最终的最近邻。
三、kd树预测
以上是第一个最近点的产生过程,把已找到的最近点在样本中删掉,再在现有的样本中找最近点,一直到找到k个点。
但同时要考虑到这个算法的缺点,因为只要超球体与某一块矩形有相交,就需要检查这个矩形是否存在最近点,而有时可能只是矩形的一小块角与相交,存在最近点的可能性很小,但是也要检查一遍,无疑增大了运算量。
算法三:球树
和kd树类似,只是将矩形改成圆形。