NaN-Searching算法,是用来寻找数据集中每个点的自然邻域(Natural Neighbors,简称NaNs)的过程。自然邻域是指那些相互将对方视为邻居的数据点集合。算法1的核心思想是利用自然邻域的概念来动态地确定每个数据点的邻域大小,而不需要预设参数。以下是详细步骤和解释:
算法1:NaN-Searching(SetOfPoints)
输入:一组数据点 SetOfPoints
输出:每个点的自然邻域列表,以及每个点的反向邻域计数 Rnb(i)
步骤:
-
初始化:
- 对于每个数据点 i ,初始化其反向邻域计数 Rnb(i) = 0 。
- 初始化每个点的自然邻域列表 NaN(i) = 空集。
- 初始化每个点的 r-邻域 NNr(i) = 空集 和 r-反向邻域 RNNr(i) = 空集。
- 设置迭代计数器 r = 1 。
-
构建KD树:
- 使用 SetOfPoints 创建一个KD树,以便快速进行空间搜索。
-
寻找r-邻域:
- 对于每个数据点 x ,使用KD树找到其第 r 近邻 y 。
- 更新 y 的反向邻域计数 Rnb(y) = Rnb(y) + 1 。
- 将 y 添加到 x 的 r-邻域 NNr(x) 。
- 将 x 添加到 y 的 r-反向邻域 RNNr(y) 。
-
迭代更新:
- 重复步骤3,直到 Rnb(x) 为0的点的数量在连续三次迭代中不再变化。
- 每次迭代后,增加 r 的值 r = r + 1 。
-
确定自然邻域:
- 当迭代完成后,对于每个数据点 i ,如果 Rnb(i) > 0 ,则其自然邻域 NaN(i) 包含所有 RNNr(i) 中的点,其中 r 是满足 Rnb(i) > 0 的最小值。
-
输出结果:
- 输出每个点的自然邻域列表 NaN(i) 和反向邻域计数 Rnb(i) 。
解释:
- 自然邻域:自然邻域是指那些相互将对方视为邻居的数据点集合。这种邻域关系是对称的,即如果点 A 认为点 B 是其邻居,那么点 B 也必须认为点 A 是其邻居。
- 反向邻域计数: Rnb(i) 表示有多少其他点将点 i 视为其自然邻域的一部分。这个计数帮助我们确定哪些点是孤立的即 Rnb(i) = 0 ,哪些点是与其他点相互连接的。
- KD树:KD树是一种用于多维空间数据的二叉搜索树,它允许快速地找到最近邻点。在算法中,KD树用于高效地找到每个点的第 r 近邻。
优势:
- 自适应性:算法不需要预设参数来确定邻域大小,而是根据数据点之间的实际距离动态地构建自然邻域。
- 无参数:由于不需要预设参数,算法可以更灵活地应用于不同类型的数据集。
- 高效性:通过使用KD树,算法能够快速地找到每个点的近邻,从而提高算法的效率。