web-dev-qa-db-fra.com

Python: moyen facile de faire une moyenne géométrique en python?

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?

17
user6922072

La formule de la moyenne gémétrique est:

geometrical mean

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))
33
Willem Van Onsem

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
15
Marcin Wojnarski

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
5
Xavier Guihot

faites juste ceci:

numbers = [1, 3, 5, 7, 10]


print reduce(lambda x, y: x*y, numbers)**(1.0/len(numbers))
3
Liam

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))
1
rmmh