Python: простой способ сделать среднее геометрическое в python?

Интересно, есть ли простой способ сделать геометрическое значение с помощью python, но без использования пакета python. Если этого не происходит, есть ли какой-либо простой пакет для геометрического среднего?

Ответ 1

Формула метрического среднего:

geometrical mean

Итак, вы можете легко написать такой алгоритм, как:

import numpy as np

def geo_mean(iterable):
    a = np.array(iterable)
    return a.prod()**(1.0/len(a))

Вам не нужно использовать numpy для этого, но он, как правило, выполняет операции над массивами быстрее, чем Python (поскольку при кастинге меньше "накладных расходов" ).

Если вероятность переполнения высока, вы можете сначала перенести числа в область журнала, вычислить сумму этих журналов, затем умножить на 1/n и, наконец, вычислить показатель, например:

import numpy as np

def geo_mean_overflow(iterable):
    a = np.log(iterable)
    return np.exp(a.sum()/len(a))

Ответ 2

В случае, если кто-то ищет здесь реализацию библиотеки, в scipy есть gmean(), возможно, более быстрый и численно более стабильный, чем пользовательская реализация:

>>> from scipy.stats.mstats import gmean
>>> gmean([1.0, 0.00001, 10000000000.])
46.415888336127786

Ответ 3

просто выполните это:

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


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

Ответ 4

Начиная с Python 3.8, стандартная библиотека поставляется с функцией geometric_mean как частью модуля statistics:

from statistics import geometric_mean

geometric_mean([1.0, 0.00001, 10000000000.]) // 46.415888336127786

Ответ 5

Здесь устойчивая к переполнению версия на чистом Python, в основном такая же, как принятый ответ.

import math

def geomean(xs):
    return math.exp(math.fsum(math.log(x) for x in xs) / len(xs))