【问题标题】:Fastest way to sample real values using a proportional probability使用比例概率对真实值进行采样的最快方法
【发布时间】:2013-10-19 18:07:47
【问题描述】:

给定一个具有N 实数的数值向量,对k 值进行采样的最快方法是什么,以便值越高被选中的概率越大?

数学

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

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

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)

谢谢。

【问题讨论】:

  • 负值应该怎么办?如果您只想忽略它们,可以使用sample(x[x>0],k,T,prob=x[x>0])
  • 或者只是将它们视为积极的? prob=abs(x)?我想我不明白这个问题。
  • 给定x = c(-10, 0, 10),那么-10被选中的概率较小,10被选中的概率较大。我将进行编辑以更好地解释。
  • 为什么投反对票?人们喜欢downvote..为什么?这对 SO 来说很烦人。这个​​问题得到了很好的编辑和解释,如果你不能或不想提供帮助,那就别管它了。
  • 一个使 x 非负数的简单方法是prob=x+min(x),

标签: r algorithm normalization sample


【解决方案1】:

几厘米。首先,仍然不完全清楚你想要什么。显然,您希望以更高的概率选择更大的数字,但是有很多方法可以做到这一点。例如,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)。这不是一个线性函数,而是一个affine function。此外,即使您已指定希望 P(X) 作为 X 的仿射函数而变化,这仍然不会唯一确定概率权重,因为有无数可能的仿射函数会产生有效的权重 (例如x-min(x)+1等)

无论如何,假设 x-min(x) 是您想要的,那么现在的问题是,在 R 中计算 x-min(x) 的最快方法是什么。我很确定答案就是 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

【讨论】:

  • @Fernando 用数学术语写下你想做什么,我们可以告诉你怎么做。如果你做不到,你的问题就跑题了。
  • 很明显你想要P(x)&gt;P(y)x&gt;y,但这并不能确切地确定P(x)P(y) 应该是什么。有很多方法可以单调地分配概率权重,您必须决定要采用哪种方式。
  • @Fernando 不,还没有完成。有无数的函数可以满足你的条件。你需要决定一个功能。
  • @Fernando 那么,这是否意味着prob = x-min(x)(可能还添加了一个很小的最小概率prob = x-min(x)+mP)是您要接受的解决方案?
  • @Fernando 如果您认为此答案没有解决问题,那么您严重未能正确编写问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
相关资源
最近更新 更多