考虑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
所以这段代码
v(i) = (v(i) - 0.5) * math.sqrt(12.0 * xVariance(i)) + xMean(i)
应该等同于:
其中 a' 和 b' 是所需均匀分布的参数,EX' 是所需分布的平均值。如果将 xMean 设置为 0,则其余代码将输入数据集中在 0 附近并调整分布。
关于scala - 为什么 MLLibGenerateLinearInput 在内部将方差乘以 12.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32024793/