如何实现指数递减的加权平均值

时间:2017-06-21 22:24:43

标签: java statistics kotlin weighted-average

我一直在尝试使用in this Wikipedia article所述的指数递减权重来实现加权平均函数。

我想我失败了!我有点太厚了,无法填补维基百科文章中似乎缺少的一些空白,因为它似乎缺少一个很好的清晰的单行定义,该函数应该在 m < / em>样本, f(x 1 ,x 2 ,... x m ) =?。

这是我尝试在Kotlin中实现它,其中数字包含我的 m 样本,分数是维基百科中提到的Δ文章:

fun weightedAverage(numbers: List<Long>, fraction: BigDecimal): Long? {
    if (! (zero < fraction && fraction < one)) {
        throw IllegalArgumentException("fraction must be in (0..1), but $fraction is outside that range")
    }
    return when(numbers.size) {
        0 -> null
        1 -> numbers.first()
        else -> multiPointWeightedAverage(numbers, fraction)
    }
}

private fun multiPointWeightedAverage(numbers: List<Long>, fraction: BigDecimal): Long {
    val m = numbers.size
    var w = one - fraction
    val w_m = w.pow(m)
    val V1 = (one - w_m) / fraction
    var sum = w * BigDecimal(numbers[0])
    for (i in 1..m-1) {
        w /= V1
        sum += w * BigDecimal(numbers[1])
    }
    return sum.setScale(0, RoundingMode.HALF_UP).toLong()
}

但我很确定这是错误的,因为,例如,我希望weightedAverage(listOf(1L, 1L, 1L), BigDecimal(0.9))能够产生输出1,但最终会吐出0.27125 ...为零。

你能帮助我纠正我的实施,希望能解释我做出的错误假设或步骤吗?

0 个答案:

没有答案