由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Statistics版 - R,用apply比用for loop 快?
相关主题
Matlab怎样把matrix的data转到vector里面?再问R的问题 - 关于matrix 的operation
提高R速度的一些tips请教如何写这个sas代码?
两个有关于R的小问题?请教一个用SAS作DATA MERGE的问题
今天又“R”了 -- 感想和请教。如何强行合并两个datasets?
更新一下Taste of R,再问两个R的问题。How to prevent values being trucated when merging two files
请教一个SAS coding请教一下SAS编程的一个问题
SAS应用问题help need for SAS macro
SAS question using PROC SQL 高手请进, 包子答谢【包子】merge 语句里的(in= )
相关话题的讨论汇总
话题: alpha话题: temp话题: lamda话题: loop话题: beta
进入Statistics版参与讨论
1 (共1页)
a******e
发帖数: 119
1
在写一个R function。打算对20k个subject分别做MCMC,MCMC做5000个iterations。也
就是说我要run 20k 个 loop, 每个loop都要做5k个iterations。目前大概需要运行几
个小时。有人建议我用apply instead of for loop,说这样可以大大加快运行速度。
这靠谱么?
有没有其他的建议可以加快运行速度的?多谢!
s*********e
发帖数: 1051
2
parallelism is the way to go.
S****E
发帖数: 150
3
同意楼上。apply比for loop快点有限
g*******u
发帖数: 148
4
MCMC is not parallelizable

【在 s*********e 的大作中提到】
: parallelism is the way to go.
k*******a
发帖数: 772
5
apply没用
首先,看看有没有一些code可以vectorize来提高运算,如果已经vectorize极限了,可
以考虑C++算
推荐用 Rcpp 来把运算最多的部分(比如posterior函数) 用C++ code写,Rcpp很好用
,写起来和写Rcode差不多。
或者,全部bayesian的运算都用C++写就更快了
a******e
发帖数: 119
6
多谢各位的回复,
如果做parallelism,需要用什么package么?能否推荐个package?
kirklanda,能否展开说一下怎么vectorize?
k*******a
发帖数: 772
7
vectorize就是对matrix vector之类的能整体操作就整体操作,体现在程序的每一步,
你可以把你的一些code贴出来看有没有提高的空间

【在 a******e 的大作中提到】
: 多谢各位的回复,
: 如果做parallelism,需要用什么package么?能否推荐个package?
: kirklanda,能否展开说一下怎么vectorize?

A*****n
发帖数: 243
8
MCMC没法并行化,但是你的20k个subject可以并行化,而不是使用loop
最简单的一个方法就是用parallel包的mclapply函数,如果
机器的cpu比较多的话,时间就可以省下啦了。
apply的速度和for loop没有太多的区别,google一下可以发现有很多的
apply vs. for速度比较的blog。

【在 a******e 的大作中提到】
: 在写一个R function。打算对20k个subject分别做MCMC,MCMC做5000个iterations。也
: 就是说我要run 20k 个 loop, 每个loop都要做5k个iterations。目前大概需要运行几
: 个小时。有人建议我用apply instead of for loop,说这样可以大大加快运行速度。
: 这靠谱么?
: 有没有其他的建议可以加快运行速度的?多谢!

a******e
发帖数: 119
9
for (g in 1:g)
{
for (m in 2:m)
{

lamda[m,]=sapply(Y[g,1:n],update.lamda)
beta[m]=rgamma(n=1,shape=n*alpha[m-1]+beta.shape,rate = (sum(lamda[m-1,]
)+beta.rate))
temp = rnorm(n=1,mean=alpha[m-1],sd=sigma)
den = (beta[m-1]^(n*alpha[m-1]))*((prod(lamda[m-1,]))^(alpha[m-1]-1))*(
exp(-alpha[m-1])*alpha.rate)/(gamma(alpha[m-1]))^n
num = (beta[m-1]^(n*temp))*((prod(lamda[m-1,]))^(temp-1))*(exp(-temp)*
alpha.rate)/(gamma(temp))^n
accep.prob=num/den

if((accep.prob>=u[m]) & (temp>0))
{
alpha[m]=temp
}else
{
alpha[m]=alpha[m-1]

}
mu1[m]=alpha[m]/beta[m]

}
for (m in 2:m)
{

lamda[m,]=sapply(Y[g,(n+1):(n+n)],update.lamda)
beta[m]=rgamma(n=1,shape=n*alpha[m-1]+beta.shape,rate = (sum(lamda[m-1,]
)+beta.rate))
temp = rnorm(n=1,mean=alpha[m-1],sd=sigma)
den = (beta[m-1]^(n*alpha[m-1]))*((prod(lamda[m-1,]))^(alpha[m-1]-1))*(
exp(-alpha[m-1])*alpha.rate)/(gamma(alpha[m-1]))^n
num = (beta[m-1]^(n*temp))*((prod(lamda[m-1,]))^(temp-1))*(exp(-temp)*
alpha.rate)/(gamma(temp))^n
accep.prob=num/den

if((accep.prob>=u[m]) & (temp>0))
{
alpha[m]=temp
}else
{
alpha[m]=alpha[m-1]
}
mu2[m]=alpha[m]/beta[m]

}
mu.diff[g,]=mu1-mu2
}

【在 k*******a 的大作中提到】
: vectorize就是对matrix vector之类的能整体操作就整体操作,体现在程序的每一步,
: 你可以把你的一些code贴出来看有没有提高的空间

k*******a
发帖数: 772
10
lambda, beta 应该可以整体update
我是说可以去掉 for (m in 2:m) 这个loop
BTW: 为什么是 m in 2:m ?没写错?

,]

【在 a******e 的大作中提到】
: for (g in 1:g)
: {
: for (m in 2:m)
: {
:
: lamda[m,]=sapply(Y[g,1:n],update.lamda)
: beta[m]=rgamma(n=1,shape=n*alpha[m-1]+beta.shape,rate = (sum(lamda[m-1,]
: )+beta.rate))
: temp = rnorm(n=1,mean=alpha[m-1],sd=sigma)
: den = (beta[m-1]^(n*alpha[m-1]))*((prod(lamda[m-1,]))^(alpha[m-1]-1))*(

相关主题
请教一个SAS coding再问R的问题 - 关于matrix 的operation
SAS应用问题请教如何写这个sas代码?
SAS question using PROC SQL 高手请进, 包子答谢请教一个用SAS作DATA MERGE的问题
进入Statistics版参与讨论
a******e
发帖数: 119
11
m in 2:m
是因为我先 initialize了lamda,alpha和beta
如何整体update,m in 2:m 是MCMC的5000个iterations。 g in 1:g 是20k个subject

【在 k*******a 的大作中提到】
: lambda, beta 应该可以整体update
: 我是说可以去掉 for (m in 2:m) 这个loop
: BTW: 为什么是 m in 2:m ?没写错?
:
: ,]

K*****2
发帖数: 9308
12
这种还是写个shell script直接扔到学校的cluster上面算好了,别折磨自己的电脑
P*****r
发帖数: 554
13
给个模板吧,我一般很土的用nohup R CMD

【在 K*****2 的大作中提到】
: 这种还是写个shell script直接扔到学校的cluster上面算好了,别折磨自己的电脑
D******n
发帖数: 2836
14
apply好像其实是一个R loop的不是真的vectorization.

【在 a******e 的大作中提到】
: 在写一个R function。打算对20k个subject分别做MCMC,MCMC做5000个iterations。也
: 就是说我要run 20k 个 loop, 每个loop都要做5k个iterations。目前大概需要运行几
: 个小时。有人建议我用apply instead of for loop,说这样可以大大加快运行速度。
: 这靠谱么?
: 有没有其他的建议可以加快运行速度的?多谢!

s*****n
发帖数: 2174
15
apply并不比for loop快, 一般情况下反而更慢. 只不过apply能让code比较elegant而
已.
lapply要快不少.
其实用R的话, 如果比较在意efficiency, 最需要注意的是如何handle objects, 那个
才是R慢的最常见原因. 其次才是avoiding explicit loops.
D******n
发帖数: 2836
16
好像lm object或者某个模型object就很坑爹的带了整个training data,害我要人工删
除。

【在 s*****n 的大作中提到】
: apply并不比for loop快, 一般情况下反而更慢. 只不过apply能让code比较elegant而
: 已.
: lapply要快不少.
: 其实用R的话, 如果比较在意efficiency, 最需要注意的是如何handle objects, 那个
: 才是R慢的最常见原因. 其次才是avoiding explicit loops.

s*****n
发帖数: 2174
17
R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object
handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data
frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快
的多.
data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000)
data2 <- data.frame(data1)
object.size(data1)
object.size(data2) # almost same size
# 0.42秒
for (i in 1:1000){
for (j in 1:1000){
data1[i,j]
}
}
# 33.2秒
for (i in 1:1000){
for (j in 1:1000){
data2[i,j]
}
}
这几乎是100倍的速度差别, 就仅仅是data frame vs matrix. 两个例子里面都有双层
for loop. 其实for loop并不是最大的问题.

【在 D******n 的大作中提到】
: 好像lm object或者某个模型object就很坑爹的带了整个training data,害我要人工删
: 除。

g******i
发帖数: 118
18
赞一个,学习!

【在 s*****n 的大作中提到】
: R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object
: handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data
: frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快
: 的多.
: data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000)
: data2 <- data.frame(data1)
: object.size(data1)
: object.size(data2) # almost same size
: # 0.42秒
: for (i in 1:1000){

D******n
发帖数: 2836
19
as。matrix也很慢, 曾经在一个loop里面,放了这个就巨慢,后来干脆整个data都是
matrix就好多了。

【在 s*****n 的大作中提到】
: R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object
: handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data
: frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快
: 的多.
: data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000)
: data2 <- data.frame(data1)
: object.size(data1)
: object.size(data2) # almost same size
: # 0.42秒
: for (i in 1:1000){

B****n
发帖数: 11290
20
Haha 原來是這樣 解了我很久的疑惑
我對R要提高速度的建議也是vectorize 用vector or matrix來寫程式 確實差很多
或是把最耗時的用c++來run
如果有很明顯的loop結構 比方說run 1000次simulation可以平行咚利用cluster or
GPU

【在 s*****n 的大作中提到】
: R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object
: handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data
: frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快
: 的多.
: data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000)
: data2 <- data.frame(data1)
: object.size(data1)
: object.size(data2) # almost same size
: # 0.42秒
: for (i in 1:1000){

相关主题
如何强行合并两个datasets?help need for SAS macro
How to prevent values being trucated when merging two files【包子】merge 语句里的(in= )
请教一下SAS编程的一个问题SAS code help
进入Statistics版参与讨论
P*****s
发帖数: 758
21
这个很有意思,是为什么呢?是不是matrix在R底层存储的是连续的内存块,而
dataframe用的是列列分别存储?

【在 s*****n 的大作中提到】
: R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object
: handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data
: frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快
: 的多.
: data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000)
: data2 <- data.frame(data1)
: object.size(data1)
: object.size(data2) # almost same size
: # 0.42秒
: for (i in 1:1000){

n******7
发帖数: 12463
22
good to know
还能再多说说object handling的问题吗?
以前也是听说apply比for快,后来看了stackoverflow的讨论才发现自己很傻很天真
因为总觉得R慢,现在R都沦为我的画图工具了

【在 s*****n 的大作中提到】
: R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object
: handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data
: frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快
: 的多.
: data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000)
: data2 <- data.frame(data1)
: object.size(data1)
: object.size(data2) # almost same size
: # 0.42秒
: for (i in 1:1000){

s*r
发帖数: 2757
23
data.frame 本质上是个list
s*****n
发帖数: 2174
24
apply 比 for loop 稍慢, 但是code 更 clean 一些而已.
n*********n
发帖数: 5605
25
不快

【在 a******e 的大作中提到】
: 在写一个R function。打算对20k个subject分别做MCMC,MCMC做5000个iterations。也
: 就是说我要run 20k 个 loop, 每个loop都要做5k个iterations。目前大概需要运行几
: 个小时。有人建议我用apply instead of for loop,说这样可以大大加快运行速度。
: 这靠谱么?
: 有没有其他的建议可以加快运行速度的?多谢!

1 (共1页)
进入Statistics版参与讨论
相关主题
【包子】merge 语句里的(in= )更新一下Taste of R,再问两个R的问题。
SAS code help请教一个SAS coding
借人 气问 两个 问题:SAS应用问题
求教 SAS base 123 Q 16SAS question using PROC SQL 高手请进, 包子答谢
Matlab怎样把matrix的data转到vector里面?再问R的问题 - 关于matrix 的operation
提高R速度的一些tips请教如何写这个sas代码?
两个有关于R的小问题?请教一个用SAS作DATA MERGE的问题
今天又“R”了 -- 感想和请教。如何强行合并两个datasets?
相关话题的讨论汇总
话题: alpha话题: temp话题: lamda话题: loop话题: beta