在 python 中计算 Ripley K(空间统计)值
项目描述
里普利
在 python 中计算 Ripley K(空间统计)值。该项目仍在开发中,目前仅支持基于“圆形”的边界区域进行自动边界校正。如果您不需要边界校正,则可以支持基于“矩形”的边界区域。这个包允许快速计算(使用kd-trees)1D-3D 系统的 RipleyK 值。
安装
您可以使用以下 pip 命令安装 RipleyK 包:
pip install ripleyk
要从源代码快速开始,请按照以下步骤操作:
-
克隆或下载此存储库并在文件夹中启动 python。
-
制作一个 Python 环境来运行。始终建议使用虚拟环境以确保安全。必须是 Python3,目前仅使用 Python 3.8 进行测试。
-
将requirement.txt 文件安装到新的python 环境中
pip install -r requirements.txt
理论
各维度计算的 Ripley K 值和归一化 L 值的数学方程如下:
一维方程:
二维方程:
3D 方程:
请注意,“区域”一词在 1D、2D 和 3D 描述中分别用于表示距离、面积和体积。r 是搜索区域的线 (1D) 或半径 (2D/3D)。ω 是搜索区域与整个样本区域的重叠比率,如果搜索区域完全在样本区域内,则为 1,如果某些搜索区域在样本区域之外,则为 <1。如果所有搜索区域都在样本区域之外,则为 0,并且不会计算 Ripley 值。I 是指示函数,如果条件 D(i,j)≤r 为真,则为 1,或者为 0,其中 D(i,j) 是点 i 和 j 之间的欧几里德距离。样本区域的大小分别定义为 1D、2D 和 3D 方程中的距离 (D)、面积 (A) 或体积 (V)。
代码示例
对于这些示例,让我们在半径为 1 的球体中创建点的随机子集:
import random
xs = []
ys = []
zs = []
radius = 1
random.seed(0)
for i in range(0,10000):
positioned = False
while positioned is False:
x = random.uniform(-radius, radius)
y = random.uniform(-radius, radius)
z = random.uniform(-radius, radius)
if (x**2)+(y**2)+(z**2) < radius**2:
xs.append(x)
ys.append(y)
zs.append(z)
positioned = True
xs = np.array(xs)
ys = np.array(ys)
zs = np.array(zs)
现在我们可以在 RipleyK 计算方法中使用我们的点列表。请注意,所有点列表都是 numpy 数组。
单半径计算(2D)
让我们简单地开始。我们将计算圆形 (r=1) 边界空间的 Ripley K 值。因为它是一个圆,我们只需要两个维度(d1 和 d2)。该calculate_ripley方法应作为前两个输入给出半径和边界空间。这些点应作为每个维度的 numpy 列表给出,其中 point[0] 的空间位置将是 xs[0]、ys[0]。
import ripleyk
radius = 0.5
bounding_radius = 1
k = ripleyk.calculate_ripley(radius, bounding_radius, d1=xs, d2=ys)
print(k)
你应该得到一个0.7573k 的值。
默认情况下,这将不包括任何边界校正。要添加它,只需添加boundary_correct=True到上面的函数中。这应该总是增加值。现在我们得到0.8646k 的值。
最后,与完全空间随机 (CSR) 相比,可以应用归一化来评估 k 值的聚类。如果分布接近 CSR,则该值应趋于 0。下面是相同的计算,但现在包括边界校正和归一化:
import ripleyk
radius = 0.5
bounding_radius = 1
k = ripleyk.calculate_ripley(radius, bounding_radius, d1=xs, d2=ys, boundary_correct=True, CSR_Normalise=True)
print(k)
当我们随机生成点时,我们看到这种归一化确实使值更接近于 0,这里我们得到0.0792。对于非随机分布的点,正值表示聚类,负值表示离散。
多半径计算 (3D)
也可以使用此函数来评估多个半径的 Ripley K 值。这是评估分布的主要方法,通过查看半径范围并根据半径绘制 k 值或标准化 k 值。下面是对我们生成的 3D 数据集执行此操作的示例:
import ripleyk
radii = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
k = ripleyk.calculate_ripley(radii, 1, d1=xs, d2=ys, d3=zs,boundary_correct=True, CSR_Normalise=True)
print(k)
您应该得到以下结果:
[0.0037195948778340066, 0.014366257675743288, 0.030708853373073164, 0.052335948982649816, 0.07924991777047796, 0.11106598410605262, 0.14776949809916906, 0.18756665481659018, 0.22661330217618136, 0.2603647483110927]
这可以简单地根据输入的半径绘制,如下所示(需要安装matplotlib):
import ripleyk
import matplotlib.pyplot as plt
radii = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
k = ripleyk.calculate_ripley(radii, 1, d1=xs, d2=ys, d3=zs,boundary_correct=True, CSR_Normalise=True)
plt.plot(radii, k, 'bo')
plt.show()
依赖项
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。