从 R/MatLab 中的点创建一个随机圆

Creating a randomized circle from points in R/MatLab

我正在和我大学的一位教授一起做一些研究,他要求我创建一些数据用于拓扑数据分析 (TDA)。

我使用了 R 和 MatLab 的两个包,但是作者似乎对如何在执行与 Betti 点的持久性相关的操作时随机化数据有类似的想法。

R(和 MatLab)中的问题是圆是用以下方法创建的:

X <- circleUnif(n=30)

这将生成一个圆,该圆具有均匀分布的点 (30),围绕中心点的半径相等。为了随机化数据,包作者的两个示例都从数据中随机抽样。这导致图像看起来像这样: Alpha Complex 教授要求的是我做的每个点都有一些'sigma'或偏离半径。这实际上会创建一个具有一定厚度的 'fuzzy' 环。这样,当对数据执行持久化时,birth/death 轴会有更有趣的输出。

此视频中的 2:30 是我想做的事情的想法: Persistent homology

如果有人知道如何在 Python 中做到这一点,我也愿意尝试其他语言。

只要您安装了 numpy(如果没有安装,请在命令行中使用 pip install numpy),以下内容应该可以正常工作。

import numpy as np

def circleUnif(n=30, radius=1, sigma=0, center=(0, 0)):
    radii = np.random.randn(n) * sigma + radius
    angles = np.random.rand(n) * np.pi * 2

    x = radii * np.cos(angles)
    y = radii * np.sin(angles)

    return np.transpose([x, y]) + center

作为示例用法:

>>> X = circleUnif(3, 1, 0, (2, 3))
>>> print X
[[1.29321773 3.70743115]
 [2.72817308 3.68539329]
 [2.35728855 2.06600595]]

根据我的经验,python 在拓扑数据分析方面不如 R 成熟。使用 python 中可用的数据科学工具没有任何问题,如果您愿意,可以使用 python 生成数据以在 R 中使用。但这是 python 确实缺乏用于数据科学任务的高质量、稳定工具的少数情况之一。我最终可能会做出一些,或者其他人可能会做出一些,但是对于大多数 TDA 算法,您现在没有太多选择。