scala - 为什么 MLLibGenerateLinearInput 在内部将方差乘以 12.0?

标签 scala random apache-spark apache-spark-mllib

考虑generateLinearInput MLLib 中的方法 LinearDataGenerator :

这是该方法的签名:

  def generateLinearInput(
      intercept: Double,
      weights: Array[Double],
      xMean: Array[Double],
      xVariance: Array[Double],
      nPoints: Int,
      seed: Int,
      eps: Double): Seq[LabeledPoint] = {

这是生成原始数据点的核心逻辑:

val rnd = new Random(seed)
val x = Array.fill[Array[Double]](nPoints)(
  Array.fill[Double](weights.length)(rnd.nextDouble()))

x.foreach { v =>
  var i = 0
  val len = v.length
  while (i < len) {
    v(i) = (v(i) - 0.5) * math.sqrt(12.0 * xVariance(i)) + xMean(i)
    i += 1
  }

特别注意12.0方差的缩放因子。 该因素的目的是什么?

为了完整起见:这是该方法的其余部分 - 其中输入线性函数应用于 x/域值以生成输出 y/范围值:

val y = x.map { xi =>
  blas.ddot(weights.length, xi, 1, weights, 1) + intercept + eps * rnd.nextGaussian()
}
y.zip(x).map(p => LabeledPoint(p._1, Vectors.dense(p._2)))

最佳答案

如果你有随机变量X

enter image description here

然后its variance is equal

enter image description here

所以这段代码

v(i) = (v(i) - 0.5) * math.sqrt(12.0 * xVariance(i)) + xMean(i)

应该等同于:

enter image description here

其中 a'b' 是所需均匀分布的参数,EX' 是所需分布的平均值。如果将 xMean 设置为 0,则其余代码将输入数据集中在 0 附近并调整分布。

关于scala - 为什么 MLLibGenerateLinearInput 在内部将方差乘以 12.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32024793/

相关文章:

scala - 如何在Scala(Spark)中比较两个数据框中的列

matlab - 如何产生以下随机变量?

ios - 随机字符串和 UIImageView 在一起

c - rand() 在循环中给出相同的结果

json - 当我尝试在 spark 上解析 Json 时出现 java.lang.NoSuchMethodError

java - 使用 java generic 从 java 调用重载的 scala case apply

scala - 计算spark scala中文本文件中数字的平均值

Scala:从特征实例化时使用 def 还是 val?

java - NoSuchElementException : next on empty iterator in MapPartitionsToPair-Spark

apache-spark - Spark 数据帧缓存/持久未按预期工作