使用比例概率对实际值进行采样的最快方法

时间:2013-10-11 15:30:09

标签: r algorithm normalization sample

给定具有N实数的数字向量,采样k值的最快方法是什么,以便更高的值更有可能被选中?

数学

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

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

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)

感谢。

1 个答案:

答案 0 :(得分: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)。这不是线性函数,而是affine function。此外,即使你已经指定你希望P(X)作为X的仿射函数变化,仍然不会唯一地确定概率权重,因为存在无限数量的可能产生有效权重的仿射函数(例如x-min(x)+1等)

在任何情况下,假设x-min(x)是您想要的,现在的问题是,在R中计算x-min(x)的最快方法是什么。我很确定答案只是{ {1}}。

最后,对于你的示例中任何地方附近的常数,尝试优化权重的计算没有多大意义,因为无论如何随机抽样需要更长的时间。例如:

x-min(x)