-2

给定一个带有N实数的数字向量,采样值的最快方法是什么k,这样更高的值就有更大的被选中的概率?

数学上

prob(X) > prob(Y) when X > Y (Linearly)

当所有条目都是正数时,这很容易sample(),只需使用probarg:

N = 1000
k = 600
x = runif(N, 0, 10)
results = sample(x, k, replace = TRUE, prob = x)

但在我的情况下它不起作用,因为有些值可能是负数。我不能丢弃或忽略负值,这就是问题所在。

那么,最快(代码速度)的方法是什么?显然我知道如何解决这个问题,问题是代码速度 - 我猜一种方法应该比其他方法慢:

1 - Normalize the x vector (a call to `range()` would be necessary + division)

2 - Sum max(x) to x (a call to `max()` then sum)

谢谢。

4

1 回答 1

4

几点评论。首先,仍然不完全清楚你想要什么。显然,您希望以更高的概率选择更大的数字,但是有很多方法可以做到这一点。例如,要么 要么rank(x)x-min(x)产生一个在 x 中单调的非负权重向量。

另一点,您不需要对权重进行归一化,因为sample只要权重为非负数,就会为您做到这一点:

> set.seed(1)
> sample(1:10,prob=1:10)
 [1]  9  8  6  2 10  3  1  5  7  4
> set.seed(1)
> sample(1:10,prob=(1:10)/sum(1:10))
 [1]  9  8  6  2 10  3  1  5  7  4

编辑时:OP现在要求输入向量中的“线性”加权函数。从技术上讲这是不可能的,因为线性函数的形式为 f(X)=cX,所以如果一个向量x既包含正值又包含负值,那么 的任何线性函数x也将包含正值和负值,除非 c=0,在在这种情况下,它仍然没有给出有效的概率权重向量。

我认为您所说的“线性”是简单的x-min(x)。这不是线性函数,而是仿射函数。此外,即使您已指定希望 P(X) 作为 X 的仿射函数而变化,这仍然不会唯一确定概率权重,因为有无数可能的仿射函数会产生有效的权重 (例如x-min(x)+1,等等)

无论如何,假设x-min(x)是你想要的,现在的问题是,x-min(x)在 R 中计算最快的方法是什么。我很确定答案只是x-min(x).

最后,对于与示例中的常量接近的任何地方,尝试优化权重计算没有多大意义,因为无论如何随机采样将花费更长的时间。例如:

> x<-rnorm(1000)
> k<-600
> p<-x-min(x)
> microbenchmark(x-min(x),sample(x,k,T,p))
Unit: microseconds
               expr   min      lq  median      uq    max neval
         x - min(x)  6.56  6.9105  7.0895  7.2515 13.629   100
 sample(x, k, T, p) 50.30 51.4360 51.7695 52.1970 66.196   100
于 2013-10-11T15:55:30.507 回答