Skip to main content

在 python 中计算 Ripley K(空间统计)值

项目描述

里普利

在 python 中计算 Ripley K(空间统计)值。该项目仍在开发中,目前仅支持基于“圆形”的边界区域进行自动边界校正。如果您不需要边界校正,则可以支持基于“矩形”的边界区域。这个包允许快速计算(使用kd-trees)1D-3D 系统的 RipleyK 值。

安装

您可以使用以下 pip 命令安装 RipleyK 包:

pip install ripleyk

要从源代码快速开始,请按照以下步骤操作:

  1. 克隆或下载此存储库并在文件夹中启动 python。

  2. 制作一个 Python 环境来运行。始终建议使用虚拟环境以确保安全。必须是 Python3,目前仅使用 Python 3.8 进行测试。

  3. 将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()

依赖项

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

ripleyk-0.0.3.tar.gz (5.3 kB 查看哈希)

已上传 source

内置分布

ripleyk-0.0.3-py3-none-any.whl (6.0 kB 查看哈希)

已上传 py3