k近邻算法是一种简单的分类方法,给定一个已知的数据样本集,找到新输入的样本的最近k个邻近样本。当k不同时候,分类结果显著不同。
在这里我们会学到两种距离,分别是欧式距离和曼哈顿距离。
其实可以看出来,欧式就是两点之间距离,曼哈顿就是两点之间x距离和y距离之和。
- kd树的构造(为了提高k近邻搜索的效率,需要设计特殊的数据结构来存储训练数据,以减少计算距离的次数 具体的方法很多,比如kd树)
邻近算法的第一步就是构造kd树,不过kd树的k和k近邻算法的k不是一个意思。
怎么构造kd树捏?
举例:假设有训练集:T{(2,3)(4,7)(5,4)(7,2)(8,1)(9,6)}
第一步:把x按照大学排序,取中位数(不是平时数学上的中位数)
2,4,5,7,8,9 -》中间是 5,7 假设我们取后面做中位数。那么可以把平面做如下切分。
取点:(7,2)
第二步,把点按照x划分的两边对应的y进行排序,取中位数
x左边:2,4,7 --》中位数4
x右边:1,6--》中位数6
划分如下:
取点:(5,4)(9,6)
第三步:把y上侧点按照x进行排序,取中位数,把y下侧点按照x进行排序取中位数。
取点(4,7)(2,3)
第四步:把右侧的按照y上下进行取中位数
取点(8,1)
那么构造的kd树是:
- kd树的搜索
例如:给点(4,3)找离他最近的点。
首先比较kd树的根,4<7那么找树的左边
然后比较y:(4,3)的y小于(5,4)的y,所以在左边
左边只有2,3了。那么以(4,3)~(2,3)为半径画圆,里面包含了(5,4),并且更新目前父节点为(5,4)
再以5,4到(4,3)画圆。
结果就是:(5,4)