我正在尝试使用Scala / Spark中的替换进行采样,定义每个类的概率。
我就是这样做的。
# Vector to sample from
x <- c("User1","User2","User3","User4","User5")
# Occurenciens from which to obtain sampling probabilities
y <- c(2,4,4,3,2)
# Calculate sampling probabilities
p <- y / sum(y)
# Draw sample with replacement of size 10
s <- sample(x, 10, replace = TRUE, prom = p)
# Which yields (for example):
[1] "User5" "User1" "User1" "User5" "User2" "User4" "User4" "User2" "User1" "User3"
如何在Scala / Spark中执行相同操作?
答案 0 :(得分:2)
我对它进行了更多调查,正如我之前所说,我不认为分层抽样的东西是适用的,所以这是另一个想法。
对于采样权重p(i)
(非负且最多加1),每个数据x(i)
的样本数具有二项分布,如果没有权重,则可以通过泊松分布近似太大了泊松参数将为p(i)*n
,其中n
是要绘制的样本总数。
迭代数据,生成m
个副本(可能为零),其中m
是泊松分布参数p(i)*n
。将所有副本展平为一个列表。 Ta-da,就是这样。
结果的长度是随机的,预期值为n
。如果它太短,我猜你可以产生更多,或者如果它太长就扔掉一些。大概如果你小心的话,当你以这种方式修正列表时,你必须考虑权重。
要生成泊松值,您可以使用apache-commons-math3中的PoissonDistribution.sample
(如Spark MLlib本身所做的那样),或者,如果您是勇敢的,您可以自己实现它。
答案 1 :(得分:1)
查看MLLib Basic Statistics标题下的Stratified sampling页面。我想也许sampleByKey
或sampleByKeyExact
可能适用于此。