Scala-Spark:替换样本,指定概率

时间:2015-12-18 16:50:57

标签: r scala apache-spark

我正在尝试使用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中执行相同操作?

2 个答案:

答案 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页面。我想也许sampleByKeysampleByKeyExact可能适用于此。