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

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

8 ответов

Решение

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

среднее геометрическое

Таким образом, вы можете легко написать алгоритм, например:

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

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

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

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

from statistics import geometric_mean

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

Просто сделай это:

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


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

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

import math

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

Вы также можете рассчитать среднее геометрическое с помощью numpy:

import numpy as np
np.exp(np.mean(np.log([1, 2, 3])))

результат:

1.8171205928321397

вы можете использовать функцию pow следующим образом:

      def p(*args):
 k=1
    for i in args:
        k*=i
    return pow(k, 1/len(args))]

>>> p(2,3)
2.449489742783178

Среднее геометрическое

import pandas as pd
geomean=Variable.product()**(1/len(Variable))
print(geomean)

Среднее геометрическое с помощью Scipy

from scipy import stats
print(stats.gmean(Variable))
Другие вопросы по тегам