我正在使用 Rbnlearn 来估计贝叶斯网络结构。它具有使用 parallel 包的内置并行化。但是,这不起作用。

使用手册页 bnlearn::parallel integration 中的示例:

library(parallel)
library(bnlearn)

cl = makeCluster(2)

# check it works.
clusterEvalQ(cl, runif(10))    # -> this works

data(learning.test)
res = gs(learning.test, cluster = cl)

在这里我收到错误 "Error in check.cluster(cluster) : cluster is not a valid cluster object."
有谁知道如何让这个工作?

最佳答案

这是一个错误。请将其报告给包维护者。

这是 check.cluster 的代码:

function (cluster)
{
    if (is.null(cluster))
        return(TRUE)
    if (any(class(cluster) %!in% supported.clusters))
        stop("cluster is not a valid cluster object.")
    if (!requireNamespace("parallel"))
        stop("this function requires the parallel package.")
    if (!isClusterRunning(cluster))
        stop("the cluster is stopped.")
}

现在,如果您查看 cl 类:
class(cl)
#[1] "SOCKcluster" "cluster"

让我们重现检查:
bnlearn:::supported.clusters
#[1] "MPIcluster"  "PVMcluster"  "SOCKcluster"

`%!in%` <- function (x, table) {
  match(x, table, nomatch = 0L) == 0L
}
any(class(cl) %!in% bnlearn:::supported.clusters)
#[1] TRUE
cluster 不在 supported.clusters 中。我相信,该函数应该只检查集群是否有一个受支持的类,而不是它是否有一个不受支持的类。

作为解决方法,您可以更改 supported.clusters :
assignInNamespace("supported.clusters",
                  c("cluster", "MPIcluster",
                    "PVMcluster", "SOCKcluster"),
                  "bnlearn")

关于r - bnlearn 的并行化(使用并行包),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28415654/

10-13 05:03