Je me demande s'il y a un moyen facile de faire des moyens géométriques en utilisant python mais sans utiliser python. S'il n'y en a pas, existe-t-il un paquet simple pour faire géométrique signifier?
La formule de la moyenne gémétrique est:
Vous pouvez donc facilement écrire un algorithme comme:
import numpy as np
def geo_mean(iterable):
a = np.array(iterable)
return a.prod()**(1.0/len(a))
Vous n'avez pas besoin d'utiliser numpy pour cela, mais il a tendance à effectuer des opérations sur des tableaux plus rapidement que Python (car il y a moins de "surcharge" avec la conversion).
Dans le cas où les chances de débordement sont élevées, vous pouvez d'abord mapper les nombres sur un domaine log, calculer la somme de ces journaux, puis multiplier par 1/n et enfin calculer l'exposant, comme:
import numpy as np
def geo_mean_overflow(iterable):
a = np.log(iterable)
return np.exp(a.sum()/len(a))
Dans le cas où quelqu'un cherche ici une implémentation de bibliothèque, il y a gmean () en scipy, peut-être plus rapide et numériquement plus stable qu'une implémentation personnalisée:
>>> from scipy.stats.mstats import gmean
>>> gmean([1.0, 0.00001, 10000000000.])
46.415888336127786
Démarrage Python 3.8
, la bibliothèque standard est livrée avec geometric_mean
fonction faisant partie du module statistics
:
from statistics import geometric_mean
geometric_mean([1.0, 0.00001, 10000000000.]) // 46.415888336127786
faites juste ceci:
numbers = [1, 3, 5, 7, 10]
print reduce(lambda x, y: x*y, numbers)**(1.0/len(numbers))
Voici une version résistante aux débordements en Python pur, fondamentalement la même que la réponse acceptée .
import math
def geomean(xs):
return math.exp(math.fsum(math.log(x) for x in xs) / len(xs))