【问题标题】:Scala-Spark: sample with replacement, specify probabilitiesScala-Spark:带替换的样本,指定概率
【发布时间】:2016-03-25 10:34:20
【问题描述】:

我正在尝试在 Scala/Spark 中进行带替换采样,定义每个类的概率。

这就是我在 R 中的做法。

# 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 中做同样的事情?

【问题讨论】:

  • 请在询问之前查看文档。
  • 我一直在广泛搜索文档,但找不到答案。如果您能指出这一点,或者,如果您能指出如何更有效地使用文档的指导,我将不胜感激。

标签: r scala apache-spark


【解决方案1】:

我进一步研究了它,正如我之前所说,我认为分层抽样的东西不适用,所以这里有另一个想法。

对于采样权重p(i)(非负且加起来为 1),每个数据 x(i) 的样本数具有二项分布,如果没有一个权重太大,则可以近似为泊松分布。 Poisson 参数将为p(i)*n,其中n 是要抽取的样本总数。

迭代数据,生成它的m 副本(可能为零),其中m 是泊松分布的,参数p(i)*n。将所有副本展平到一个列表中。塔达,就是这样。

结果的长度是随机的,期望值为n。如果它太短,我想你可以产生更多,或者如果它太长则扔掉一些。大概如果你小心的话,当你以这种方式修复列表时,你将不得不考虑权重。

要生成泊松值,您可以使用来自 apache-commons-math3 的PoissonDistribution.sample(就像 Spark MLlib 本身所做的那样),或者,如果您有勇气,您可以自己实现它。

祝你好运,玩得开心。如果您还有其他问题,我可以尝试回答。

【讨论】:

    【解决方案2】:

    查看MLLib Basic Statistics 标题Stratified sampling 下的页面。我想sampleByKeysampleByKeyExact 在这里可能比较合适。

    【讨论】:

    • 我已经看过了,但这不是我想要的。不过我会重新审视它。
    • 我不明白它有什么不同。也许你可以解释一下。
    • 我认为你可能是对的。我需要试试。你有一个可行的例子吗?我是 scala 的新手,无法真正弄清楚语法。具体来说,我需要从数据框中的列中计算分数。
    • 我认为你是对的,这些功能不适用。我试图找出一种方法来重申您的问题,以便这些功能可以工作,但我没有找到任何东西。我会考虑另一种解决方法。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多