首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修正经验累积函数

修正经验累积函数
EN

Stack Overflow用户
提问于 2014-02-19 12:13:23
回答 3查看 78关注 0票数 3

我有以下问题:

给定一个观察流,找出少于或等于当前最后一次观测的观测数。例如,如果流观察是

8,1,10,3,9,7,4,5,6,2

然后我们有以下更新:

  1. 观测- 8,有1次观测小于或等于8次
  2. 观测- 8,1,有1次观测小于或等于1
  3. 观测- 8,1,10,有3次观测小于或等于10
  4. ..。

因此,人们将获得这样的价值。

1,1,3,2,4,3,3,4,5,2

解决方案应该非常快,因为我正在处理庞大的数据集。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-19 13:06:30

使用for,但方向相反,我不测试,但我认为它更快。

代码语言:javascript
运行
复制
xx <- c(8, 1, 10, 3, 9, 7, 4, 5, 6, 2)
res = vector('integer',length=length(xx))
for (i in rev(seq_along(xx))) {
  res[i] <- sum(xx[i]>=xx)
  xx <- xx[-i]
}
res
[1] 1 1 3 2 4 3 3 4 5 2
票数 2
EN

Stack Overflow用户

发布于 2014-02-19 12:18:16

您可以使用sapply

代码语言:javascript
运行
复制
vec <- c(8, 1, 10, 3, 9, 7, 4, 5, 6, 2)

sapply(seq_along(vec), function(x) sum(vec[seq(x)] <= vec[x]))
# [1] 1 1 3 2 4 3 3 4 5 2

因为性能很重要,所以也可以使用vapply。它可能更快(未经测试):

代码语言:javascript
运行
复制
vapply(seq_along(vec), function(x) sum(vec[seq(x)] <= vec[x]), integer(1))
# [1] 1 1 3 2 4 3 3 4 5 2
票数 1
EN

Stack Overflow用户

发布于 2014-02-19 20:49:23

所以我不能一个人待着,所以我创造了一个

代码语言:javascript
运行
复制
   carl<-function(vec) {
newct<-vector('integer',length=length(vec))
vlen<-length(vec)
for(j in 1:length(vec) ) {
    wins<- (which(vec[j:vlen] >= vec[j])+j-1)
    newct[wins]<-newct[wins]+1
}
}

看起来很管用但是..。

代码语言:javascript
运行
复制
Rgames> set.seed(20)
Rgames> vec<-runif(2000)



 Rgames> microbenchmark(carl(vec),agstudy(vec),times=10)
Unit: milliseconds
         expr      min       lq   median       uq      max neval
    carl(vec) 86.75314 87.55323 88.16816 88.80831 89.65117    10
 agstudy(vec) 70.26213 70.83771 71.06158 71.72247 71.93800    1

仍然不如农业学习的代码那么好。也许有人能收紧我的圈套?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21880155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档