K近邻算法

225 阅读2分钟

k近邻算法是一种简单的分类方法,给定一个已知的数据样本集,找到新输入的样本的最近k个邻近样本。当k不同时候,分类结果显著不同。

在这里我们会学到两种距离,分别是欧式距离和曼哈顿距离。

image.png

其实可以看出来,欧式就是两点之间距离,曼哈顿就是两点之间x距离和y距离之和。

  • kd树的构造(为了提高k近邻搜索的效率,需要设计特殊的数据结构来存储训练数据,以减少计算距离的次数 具体的方法很多,比如kd树)

邻近算法的第一步就是构造kd树,不过kd树的k和k近邻算法的k不是一个意思。

怎么构造kd树捏?

举例:假设有训练集:T{(2,3)(4,7)(5,4)(7,2)(8,1)(9,6)}

image.png

第一步:把x按照大学排序,取中位数(不是平时数学上的中位数)

2,4,5,7,8,9 -》中间是 5,7 假设我们取后面做中位数。那么可以把平面做如下切分。

image.png

取点:(7,2)

第二步,把点按照x划分的两边对应的y进行排序,取中位数

x左边:2,4,7 --》中位数4

x右边:1,6--》中位数6

划分如下:

image.png

取点:(5,4)(9,6)

第三步:把y上侧点按照x进行排序,取中位数,把y下侧点按照x进行排序取中位数。

image.png

取点(4,7)(2,3)

第四步:把右侧的按照y上下进行取中位数

image.png

取点(8,1)

那么构造的kd树是:

image.png

  • kd树的搜索

例如:给点(4,3)找离他最近的点。

首先比较kd树的根,4<7那么找树的左边

然后比较y:(4,3)的y小于(5,4)的y,所以在左边

左边只有2,3了。那么以(4,3)~(2,3)为半径画圆,里面包含了(5,4),并且更新目前父节点为(5,4)

image.png

再以5,4到(4,3)画圆。

image.png

结果就是:(5,4)