python - 在 R 中高效执行复杂的 Python 代码
问题描述
我正在寻找一种在 R 中以快速灵活的方式执行 Python 代码的有效方法。
问题是我想从拓扑数据分析中执行一个特定的方法,称为持久同源性,你不需要详细了解它就可以理解我正在处理的问题。
问题是,在处理大型数据集时,计算持久同源性并不是最简单的事情,因为它需要大量的内存和计算时间。
然而,执行在 R 包TDA中实现的方法非常不方便:它从大约 800 个数据点开始崩溃,并且实际上不允许我使用近似算法。
相比之下,Python 包Ripser允许我在 Python 中轻松地对数千个点进行计算。此外,它还允许为更大的数据集提供一个近似结果的参数,并且还可以存储我想要的输出。总之,用这个包计算持久同源性要方便得多。
但是,由于我正在处理的所有其他内容都在 R 中,因此我也可以更方便地在 R 中执行来自 Ripser 包的代码。一个说明性的例子如下:
# Import R libraries
library("reticulate") # Conduct Python code in R
library("ggplot2") # plotting
# Import Python packages
ripser <- import("ripser") # Python package for computing persistent homology
persim <- import("persim") # Python package for many tools used in analyzing Persistence Diagrams
# Generate data on circle
set.seed(42)
npoints <- 200
theta <- 2 * pi * runif(npoints)
noise <- cbind(rnorm(npoints, sd=0.1), rnorm(npoints, sd=0.1))
X <- data.frame(x=cos(theta) + noise[,1], y=sin(theta) + noise[,2])
# Compute persistent homology on full data
PHfull <- ripser$ripser(X, do_cocycles=TRUE) # slow if X is large
# Plot diagrams
persim$plot_diagrams(PHfull$dgms) # crashes
现在我在使用这段代码时有两个问题:
在这个例子中,由 ripser 函数执行的持久同源计算工作得非常好。但是,当我增加 X 中的数据点数量时,例如 npoints ~ 2000,计算将花费很长时间,而我在 Python 中直接执行计算时大约需要 30 秒。我真的不知道幕后发生了什么导致计算时间的巨大差异。这是因为对于这个示例,R 可能不如 Python 方便,并且不是将我的参数转换为 Python 中的自定义类型并在 Python 中执行代码,而是将 Python 代码转换为 R 代码?我正在寻找一种将这种灵活性和高效的类型转换与 Python 的速度相结合的方法。
在 Python 中,最后一行的类比将根据我的持久同源性计算的结果绘制图像。但是,执行此行会导致 R 崩溃。有没有一种可能的方法来显示通常会在 R 中生成 Python 的图像?