给定具有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)
感谢。
答案 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)