Come calcolare una media ponderata?

La mia lingua è PHP, ma l'algorithm dovrebbe essere abbastanza universale.

Ho una matrix associativa di (diciamo) valutazioni e il numero di volte che è stata data la valutazione.

$ratings = arrays( 1 => 1, 2 => 3, 3 => 6, 4 => 3, 5 => 3 ); 

Questo è l'equivalente di: [1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5] , ma dati i numbers con cui sto lavorando, sarebbe abbastanza inefficiente convertire dalla prima alla seconda.

Quale sarebbe l'algorithm per calcolare la media dei numbers sopra?

Prova questo:

 $total = 0; $count = 0; foreach($ratings as $number=>$frequency) { $total += $number * $frequency; $count += $frequency; } return $total / $count; 

Non functionrebbe?

 $total = 0; $sum = 0; foreach ($ratings as $k => $v) { $total += $k * $v; $sum += $v; } echo $total / $sum; 

EDIT: Beh, sembro sciocco, dal momento che qualcuno mi ha battuto su di esso. Oh bene.

Dubbio Posso battere la risposta accettata, ma trovo che le funzioni di loop incorporate corrono più velocemente dei loops con script. Non sei sicuro di quanto le chiamate a $ moltiplicarsi saranno ottimizzate. Se questo è veramente lento, mi aspetto che qualcuno lo indicherà in un commento.

 function multiply( $k , $v ) { return $k * $v; } return arrays_sum( arrays_map( 'multiply' , arrays_keys($ratings) , $ratings ) ) / arrays_sum( $ratings );