我是 Rstan 世界的新手,但我的论文确实需要它。我实际上正在使用来自纽约大学的一个人的脚本和一个类似的数据集,他报告说类似 DS 的估计时间约为 18 小时。但是,当我尝试运行我的模型时,它在 18 小时内不会超过 10%。因此,我请求一些帮助以了解我做错了什么以及如何提高效率。
我正在运行一个 500 迭代、100 次预热 2 链模型,其中包含 5 个参数的 Bernoulli_logit 函数,试图通过 No U Turn MC 程序估计其中的 2 个。(在每个步骤中,它从随机正态 a 中提取每个参数,然后估计 y 并将其与实际数据进行比较,以查看新参数是否更适合数据)
y[n] ~ bernoulli_logit( alpha[kk[n]] + beta[jj[n]] - gamma * square( theta[jj[n]] - phi[kk[n]] ) );
(n 约为 1000 万)我的数据是 0 和 1 的 10.000x1004 矩阵。总结一下,这是一个关于人们在推特上关注政客的矩阵,我想根据他们关注的人来估计他们的政治理念。我在带有 R x64 3.1.1 的 RStudio 上运行模型,在 Win8 Professional、6 位、I7 四核和 16 GB 内存上运行。检查性能,rsession 使用不超过 14% 的 CPU 和 6GB 的内存,尽管还有 7 GB 是免费的。在尝试对 10.000x250 矩阵进行二次采样时,我注意到它将使用低于 1.5GB 的空间。但是,我已经使用 50x50 数据集尝试了该过程,并且效果很好,因此该过程没有错误。Rsession 打开 8 个线程,我看到每个内核上的活动,但没有一个被完全占用。我想知道为什么我的电脑不能尽其所能地工作,以及是否可能存在一些瓶颈、上限或设置阻止它这样做。R 是 64 位的(刚刚检查过),所以 Rstan 应该是(即使我在安装时遇到了一些困难并且可能弄乱了一些参数)
这就是我编译它时发生的事情
Iteration: 1 / 1 [100%] (Sampling)
# Elapsed Time: 0 seconds (Warm-up)
# 11.451 seconds (Sampling)
# 11.451 seconds (Total)
SAMPLING FOR MODEL 'stan.code' NOW (CHAIN 2).
Iteration: 1 / 1 [100%] (Sampling)
# Elapsed Time: 0 seconds (Warm-up)
# 12.354 seconds (Sampling)
# 12.354 seconds (Total)
而当我运行它时,它只能工作几个小时,但它永远不会超过第一个链的 10%(主要是因为我在我的电脑即将崩溃后中断了它)。
Iteration: 1 / 500 [ 0%] (Warmup)
并具有以下设置:
stan.model <- stan(model_code=stan.code, data = stan.data, init=inits, iter=1, warmup=0, chains=2)
## running modle
stan.fit <- stan(fit=stan.model, data = stan.data, iter=500, warmup=100, chains=2, thin=thin, init=inits)
请帮我找出是什么减慢了程序(如果没有发生任何事情,我可以操纵什么来在更短的时间内获得一些合理的结果?)。
我提前谢谢你,
机器学习
这是模型(来自纽约大学的 Pablo Barbera)
n.iter <- 500
n.warmup <- 100
thin <- 2 ## this will give up to 200 effective samples for each chain and par
Adjmatrix <- read.csv("D:/TheMatrix/Adjmatrix_1004by10000_20150424.txt", header=FALSE)
##10.000x1004 matrix of {0, 1} with the relationship "user i follows politician j"
StartPhi <- read.csv("D:/TheMatrix/StartPhi_20150424.txt", header=FALSE)
##1004 vector of values [-1, 1] that should be a good prior for the Phi I want to estimate
start.phi<-ba<-c(do.call("cbind",StartPhi))
y<-Adjmatrix
J <- dim(y)[1]
K <- dim(y)[2]
N <- J * K
jj <- rep(1:J, times=K)
kk <- rep(1:K, each=J)
stan.data <- list(J=J, K=K, N=N, jj=jj, kk=kk, y=c(as.matrix(y)))
## rest of starting values
colK <- colSums(y)
rowJ <- rowSums(y)
normalize <- function(x){ (x-mean(x))/sd(x) }
inits <- rep(list(list(alpha=normalize(log(colK+0.0001)),
beta=normalize(log(rowJ+0.0001)),
theta=rnorm(J), phi=start.phi,mu_beta=0, sigma_beta=1,
gamma=abs(rnorm(1)), mu_phi=0, sigma_phi=1, sigma_alpha=1)),2)
##alpha and beta are the popularity of the politician j and the propensity to follow people of user i;
##phi and theta are the position on the political spectrum of pol j and user i; phi has a prior given by expert surveys
##gamma is just a weight on the importance of political closeness
library(rstan)
stan.code <- '
data {
int<lower=1> J; // number of twitter users
int<lower=1> K; // number of elite twitter accounts
int<lower=1> N; // N = J x K
int<lower=1,upper=J> jj[N]; // twitter user for observation n
int<lower=1,upper=K> kk[N]; // elite account for observation n
int<lower=0,upper=1> y[N]; // dummy if user i follows elite j
}
parameters {
vector[K] alpha;
vector[K] phi;
vector[J] theta;
vector[J] beta;
real mu_beta;
real<lower=0.1> sigma_beta;
real mu_phi;
real<lower=0.1> sigma_phi;
real<lower=0.1> sigma_alpha;
real gamma;
}
model {
alpha ~ normal(0, sigma_alpha);
beta ~ normal(mu_beta, sigma_beta);
phi ~ normal(mu_phi, sigma_phi);
theta ~ normal(0, 1);
for (n in 1:N)
y[n] ~ bernoulli_logit( alpha[kk[n]] + beta[jj[n]] -
gamma * square( theta[jj[n]] - phi[kk[n]] ) );
}
'
## compiling model
stan.model <- stan(model_code=stan.code,
data = stan.data, init=inits, iter=1, warmup=0, chains=2)
## running modle
stan.fit <- stan(fit=stan.model, data = stan.data,
iter=n.iter, warmup=n.warmup, chains=2,
thin=thin, init=inits)
samples <- extract(stan.fit, pars=c("alpha", "phi", "gamma", "mu_beta",
"sigma_beta", "sigma_alpha"))