最近邻模型

1、模型概述

判别模型,不具有显示的学习过程,但是需要存储训练样本。包括K最近邻模型(KNeighborsClassifier)和区域最邻近模型(RadiusNeighborsClassifier)。适用于类别之间没有明确界限或者界限不规则的数据场景。可以用于采集样本不均衡的情况,但是采集样本均衡有助于提高模型的准确性。

K最近邻模型用K个与待判别数据距离最近的数据的类别,确定待判别数据所属的类别。该方法适可以用于采集样本不均衡的情况。

区域最邻近模型:用R区域内数据的类别,确定待判别数据所属的类别。区域最邻近模型可以用于于采集样本不均衡的情况。

2、关键问题

(1)K值选择和R
参数K是用户指定的,K的取值取决于数据,较大的K可以抑制噪声数据的干扰,但是会导致分类边界模糊。在数据不均衡时,K的值不能大于样本数量最小的类别的样本数。
参数R是用户指定的,可以计算各个类别的区域半径,参考区域半径指定R

(2)分类决策规则
参与判别的各个数据的权值可以是相同的,即多数表决,也可以基于与待判别数据的距离设定权值,距离越小,权值越大。

3、搜索k最近邻点的算法

如何对训练数据进行快速的K近邻搜索,在数据维数高数据量大时至关重要。线性扫描是最直观的方法,但也是最耗时的方法。下面介绍两种K近邻搜索算法

3.1 KD树

(1)构造KD树
KD树是二叉树,表示对k维空间的一个划分(对应数据的特征数),构造KD树的方法:

Step1:构造根节点,根节点包含所有的样本点,选择第一维对数据进行切分,切分点为该特征的中位数据(保证二叉树平衡),左子节点小于切分点,右子节点大于切分点,切分点保存在根节点;
Step2:对于深度为j的节点,选择第l维对数据进
行切分(l=(j mod k)+1),切分点为该特征的中位数据,左子节点小于切分点,右子节点大于切分点,切分点保存在该节点;重复执行Step2,直到两个子区域没有样本点实例。

注:当样本点个数n为偶数时,中位数取n/2或者n/2+1处的样本点。
将数据存储为KD树结构,可以加速最邻近点的搜索。

(2)搜索KD树
Step1:给定一个目标点,搜索其最近邻,首先找到包含该目标点的叶节点,从根节点出发,递归的向下访问KD树,如果当前维小于切分点坐标则移动到左子节点,否则移动到右子节点,直到子节点为叶节点为止,以此叶节点为当前最临近点

Step2:递归的向上回退,在每个节点进行以下操作
A)如果该节点保存的实例点比当前最近点距离目标点更近,则以该实例点为当前最近点。
B)检查该子节点的父节点的另一个子节点是否有更近的点,以目标点为圆心,当前最邻近点到目标点的距离为半径,是否与另一子节点对应的区域相交,如果相交可能存在更近的点,如果不相交继续向上回退,当退回到根节点时,当前的最邻近点即为最邻近点。

3.2 BALL树

Ball Tree是一个所有节点都是超球体的二叉树,每个节点包含其子节点所有的实例点,即节点间存在重叠,一个节点的两个子节点的实例点不同,对于任一目标点,其到球的距离小于等于到球内点的距离

(1)构造Ball树 (k-d Construction Algorithm)
构造Ball树的过程类似于构建KD树的过程,不同点是:
a)选择数据最分散的维对数据进行切分,计算切分后的该维的中心点
b)每个节点Ball的半径为节点内各个点到中心点之间的距离。

(2)搜索Ball树
基于Ball树的最邻近搜索算法是深度优先搜索算法,该算法的核心思想是,当前球节点B
a)如果目标点到球节点B中心点的距离大于当前K个最邻近点最远点的距离,则忽略该球节点。
b)如果球节点B是叶子节点,遍历B中的实例点,找到B中与目标点距离小于当前K最近邻最大距离的点,置换该点
c)如果球节点B是内部节点,分布对子节点进行a、b步骤操作,优先执行临近节点
需要对K个最邻近点进行排序,每次替换距离最大的点。

3.3 搜索算法的对比

算法的选择取决于数据量、数据维度、数据稀疏度;
(1) 算法复杂度
线性扫描算法复杂度为O(N),Ball Tree和KD Tree的算法复杂度为O(logN)
(2) 数据量
树结构算法除了都需要数结构的构建,在数据量较少时,线性扫描算法优于树结构算法
(3) 数据维度
当数据维度较高时,KD Tree算法会出现维度灾难(20维),而Ball Tree在沿着一系列的超球面来分割数据,适用于高维空间。
(4) 数据稀疏度
数据稀疏时,树结构算法查询更快。

猜你喜欢

转载自blog.csdn.net/weixin_37801695/article/details/85329105