php - secundaria - ¿Cómo calcular una media ponderada?
para que sirve la media ponderada (3)
Mi lenguaje es PHP, pero el algoritmo debería ser bastante universal.
Tengo una matriz asociativa de clasificaciones (digamos) y la cantidad de veces que se ha otorgado esa calificación.
$ratings = array(
1 => 1,
2 => 3,
3 => 6,
4 => 3,
5 => 3
);
Esto es equivalente a: [1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5]
, pero dados los números con los que estoy trabajando, sería bastante ineficiente convertir de la primera forma a la segunda.
¿Cuál sería el algoritmo para calcular la media de los números anteriores?
¿No funcionaría esto?
$total = 0;
$sum = 0;
foreach ($ratings as $k => $v) {
$total += $k * $v;
$sum += $v;
}
echo $total / $sum;
EDITAR: Bueno, me veo tonto, ya que alguien me golpeó. Oh bien.
Dudo que pueda superar la respuesta aceptada, pero creo que las funciones integradas de bucle se ejecutan más rápido que los bucles con scripts. No estoy seguro de qué tan bien se optimizarán las llamadas a $ multiplicar. Si esto es realmente lento, entonces espero que alguien lo señale en un comentario.
function multiply( $k , $v ) { return $k * $v; }
return array_sum( array_map( ''multiply'' , array_keys($ratings) , $ratings ) ) / array_sum( $ratings );
Prueba esto:
$total = 0;
$count = 0;
foreach($ratings as $number=>$frequency) {
$total += $number * $frequency;
$count += $frequency;
}
return $total / $count;