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

我一直在尝试使用这个维基百科文章中描述的按指数递减权重来实现加权平均函数。

我想我失败了! 我有点太难以填补维基百科文章中似乎缺少的一些空白,因为它似乎缺少一个很好的清晰的单行定义, 给定m个样本的函数应该产生什么, 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 …哪轮降至零。

你能帮我纠正一下我的执行情况,希望能解释我做了什么错误的假设或步骤吗?

Interesting Posts