scipy.spatial.cKDTree.

count_neighbors#

cKDTree.count_neighbors(self, other, r, p=2., weights=None, cumulative=True)#

计算可以形成多少对附近的配对。

计算可以形成多少对 (x1,x2) ,其中 x1self 中抽取,x2other 中抽取,并且满足 distance(x1, x2, p) <= r

selfother 上的数据点可以选择通过 weights 参数进行加权。(见下文)

这是根据 Gray 和 Moore 描述的“两点相关”算法改编的 [1] 。详见注释以进一步讨论。

参数:
其他cKDTree 实例

另一个可以从中抽取点的树,可以是与自身相同的树。

r浮点数或一维浮点数数组

用于生成计数的半径。多个半径通过一次树遍历进行搜索。如果计数是非累积的(cumulative=False),r 定义了区间的边缘,并且必须是非递减的。

pfloat, 可选

1<=p<=无穷大。使用哪种 Minkowski p-范数。默认值为 2.0。如果可能发生溢出,有限的大 p 可能会导致 ValueError。

权重元组, 类数组, 或 None, 可选

如果为 None,则配对计数是无权重的。如果以元组形式给出,weights[0] 是 self 中点的权重,weights[1] 是 other 中点的权重;任何一个都可以是 None,表示点是无权重的。如果以 array_like 形式给出,weights 是 selfother 中点的权重。为了使其有意义,selfother 必须是同一棵树。如果 selfother 是两棵不同的树,则会引发 ValueError。默认值:None

累积bool, 可选

返回的计数是否是累积的。当 cumulative 设置为 False 时,算法针对大量由 r 指定的 bin (>10) 进行了优化。当 cumulative 设置为 True 时,算法针对少量 r 进行了优化。默认值:True

返回:
结果标量或一维数组

对数。对于未加权的计数,结果是整数。对于加权的计数,结果是浮点数。如果 cumulative 为 False,result[i] 包含计数,其中 (-inf if i == 0 else r[i-1]) < R <= r[i]

注释

配对计数是从由对象位置组成的数据集中计算两点相关函数的基本操作。

两点相关函数测量物体的聚集程度,在宇宙学中被广泛用于量化我们宇宙中的大尺度结构,但在其他领域中,如果物体也存在自相似的组合,它也可能对数据分析有用。

Landy-Szalay 估计器用于 D 的二点相关函数,测量 D 中的聚类信号。 [2]

例如,给定两组对象的位置,

  • 对象 D (数据) 包含聚类信号,并且

  • 不包含信号的对象 R (随机),

\[\xi(r) = \frac{<D, D> - 2 f <D, R> + f^2<R, R>}{f^2<R, R>},\]

其中括号表示在 r``(距离)周围的有限区间内,两个数据集之间的计数对,对应于设置 `cumulative=False`,而 ``f = float(len(D)) / float(len(R)) 是数据和随机对象数量之间的比率。

这里实现的算法大致基于 [1] 中描述的双树算法。我们根据 cumulative 的设置在两种不同的配对累积方案之间切换。当 cumulative == False 时,我们使用的方法的计算时间不随总箱数的增加而增加。当 cumulative == True 时,算法的计算时间随箱数的增加线性增长,尽管当只使用1或2个箱时,它的速度稍快。[5]

作为朴素配对计数的扩展,加权配对计数计算的是权重的乘积而不是配对的数量。加权配对计数用于估计标记的相关函数([3],第2.2节),或正确计算每个距离区间内数据的平均值(例如[Rad0e36a8ad3c-4]_,关于红移的第2.1节)。

[1] (1,2)

Gray 和 Moore, “统计学习中的 N 体问题”, 《天空挖掘》, 2000, arXiv:astro-ph/0012333

[2]

Landy 和 Szalay, “角相关函数的偏差和方差”, 《天体物理学杂志》, 1993年, DOI:10.1086/172900

[3]

Sheth, Connolly 和 Skibba, “星系形成模型中的显著相关性”, 2005, arXiv:astro-ph/0511773

[4]

Hawkins 等人,“2dF 星系红移巡天:相关函数、特殊速度和宇宙物质密度”,《皇家天文学会月报》,2002年,DOI:10.1046/j.1365-2966.2003.07063.x

示例

你可以在两个 kd-树 之间计算在一定距离内的邻居数量:

>>> import numpy as np
>>> from scipy.spatial import cKDTree
>>> rng = np.random.default_rng()
>>> points1 = rng.random((5, 2))
>>> points2 = rng.random((5, 2))
>>> kd_tree1 = cKDTree(points1)
>>> kd_tree2 = cKDTree(points2)
>>> kd_tree1.count_neighbors(kd_tree2, 0.2)
1

这个数字与 query_ball_tree 计算的总对数相同:

>>> indexes = kd_tree1.query_ball_tree(kd_tree2, r=0.2)
>>> sum([len(i) for i in indexes])
1