【发布时间】:2018-03-02 17:25:04
【问题描述】:
我编写了以下两个函数,它们将转换矩阵作为输入,哪些节点应该处于吸收状态并对其进行转换。
第一个函数set.absorbing.states() 有3 个参数。 tm 是初始转移矩阵,第二个inn 是一个指定的初始节点,而第三个soi 是感兴趣的集合。 “感兴趣的集合”是指该矩阵中必须设置为吸收状态的一组节点。这样一个初始矩阵如下:
tm <- read.table(row.names=1, header=FALSE, text="
A 0.2 0.3 0.1 0.2 0.1 0.1
B 0.3 0.1 0.1 0.2 0.2 0.1
C 0 0.2 0.4 0.1 0.2 0.1
D 0.2 0.1 0.2 0.3 0.1 0.1
E 0.2 0.2 0.1 0.2 0.1 0.2
F 0.3 0.2 0.4 0.1 0 0")
colnames(tm) <- row.names(tm)
如您所见,该矩阵中没有吸收状态。例如,假设我们要将A 和E 以及随机选择的初始节点B 设置为吸收状态。
通过执行第一个函数tm1 <- set.absorbing.states( tm , "B", c("A","E")),我们得到了一个已设置吸收状态的矩阵:
A B C D E F
A 1.0 0.0 0.0 0.0 0.0 0.0
B 0.3 0.1 0.1 0.2 0.2 0.1
C 0.0 0.2 0.4 0.1 0.2 0.1
D 0.2 0.1 0.2 0.3 0.1 0.1
E 0.0 0.0 0.0 0.0 1.0 0.0
F 0.3 0.2 0.4 0.1 0.0 0.0
如您所见,A 和 E 已变为吸收状态。
下一步是将该矩阵转换为所有吸收状态节点(行和列)都到达末尾的方式。因此,通过运行ptm <- transform.tm( tm1, c("A","E") ),我们得到了一个如下所示的矩阵:
B C D F A E
B 0.1 0.1 0.2 0.1 0.3 0.2
C 0.2 0.4 0.1 0.1 0.0 0.2
D 0.1 0.2 0.3 0.1 0.2 0.1
F 0.2 0.4 0.1 0.0 0.3 0.0
A 0.0 0.0 0.0 0.0 1.0 0.0
E 0.0 0.0 0.0 0.0 0.0 1.0
您现在可以清楚地看到A 和E 节点到达了该矩阵的末尾。
下面是我正在使用的函数。
set.absorbing.states <- function ( tm, inn, soi )
{
set <- which( row.names(tm) %in% soi )
set <- set[which( set != inn )]
for (i in set )
tm[i,] <- 0
for (i in set)
tm[i,i] <- 1
tm
}
transform.tm <- function ( tm, soi )
{
end_sets <- which(row.names(tm) %in% soi)
ptm <- rbind( cbind(tm[-end_sets, -end_sets], tm[-end_sets, end_sets]) , cbind(tm[end_sets, -end_sets], tm[end_sets, end_sets]) )
ptm
}
现在的问题是,有了这么小的矩阵,一切都正常工作。但是我尝试使用一个大矩阵(20.000*20.000),它需要 32GB RAM 来执行第二个函数。
那么有什么方法可以以更节省资源的方式执行此操作吗?
【问题讨论】: