我一直在尝试使用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 ...为零。
你能帮助我纠正我的实施,希望能解释我做出的错误假设或步骤吗?