gpt4 book ai didi

r - 如何改进这个算法?

转载 作者:行者123 更新时间:2023-12-04 12:20:30 27 4
gpt4 key购买 nike

Windows 7 上的 R 版本 2.11.1 32 位

我得到的数据 train.txt 如下:

USER_A USER_B ACTION
1 7 0
1 8 1
2 6 2
2 7 1
3 8 2

我按照以下算法处理数据:
train_data=read.table("train.txt",header=T)
result=matrix(0,length(unique(train_data$USER_B)),2)
result[,1]=unique(train_data$USER_B)
for(i in 1:dim(result)[1])
{
temp=train_data[train_data$USER_B%in%result[i,1],]
result[i,2]=sum(temp[,3])/dim(temp)[1]
}

结果是 train_data 中每个 USER_B 的分数。分数定义为:

USER_B的得分=(USER_B所有ACTION的总和)/(USER_B的推荐次数)

但是train_data很大,我可能要三天才能完成这个程序,所以我来寻求帮助,这个算法可以改进吗?

最佳答案

运行您的示例,您想要的结果是计算每个唯一 USER_B 的平均 ACTION:

     [,1] [,2]
[1,] 7 0.5
[2,] 8 1.0
[3,] 6 2.0

您可以使用 ddply() 用一行代码来做到这一点。包中的函数 plyr
library(plyr)
ddply(train_data[, -1], .(USER_B), numcolwise(mean))

USER_B ACTION
1 6 2.0
2 7 0.5
3 8 1.0

或者,函数 tapply在基础 R 中做同样的事情:
tapply(train_data$ACTION, train_data$USER_B, mean)

根据表的大小,您可以获得 20 倍或更高的执行时间改进。这是具有一百万个条目的 data.frame 的 system.time 测试。您的算法需要 116 秒,ddply() 需要 5.4 秒,tapply 需要 1.2 秒:
train_data <- data.frame(
USER_A = 1:1e6,
USER_B = sample(1:1e3, size=1e6, replace=TRUE),
ACTION = sample (1:100, size=1e6, replace=TRUE))

yourfunction <- function(){
result <- matrix(0,length(unique(train_data$USER_B)),2)
result[,1] <- unique(train_data$USER_B);
for(i in 1:dim(result)[1]){
temp=train_data[train_data$USER_B%in%result[i,1],]
result[i,2]=sum(temp[,3])/dim(temp)[1]
}
result
}

system.time(XX <- yourfunction())
user system elapsed
116.29 14.04 134.33

system.time(YY <- ddply(train_data[, -1], .(USER_B), numcolwise(mean)))
user system elapsed
5.43 1.60 7.19

system.time(ZZ <- tapply(train_data$ACTION, train_data$USER_B, mean))
user system elapsed
1.17 0.06 1.25

关于r - 如何改进这个算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5645297/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com