web-dev-qa-db-ja.com

Python:Pythonで幾何平均を行う簡単な方法?

pythonを使用して幾何平均を行う簡単な方法はありますか?pythonパッケージ。平均?

17
user6922072

幾何平均の公式は次のとおりです。

geometrical mean

したがって、次のようなアルゴリズムを簡単に書くことができます。

import numpy as np

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

そのためにnumpyを使用する必要はありませんが、配列に対してPython(キャストの「オーバーヘッド」が少ないため)よりも高速に処理を実行する傾向があります。

overflowの可能性が高い場合、最初にlogドメインに数値をマッピングし、これらのログの合計を計算してから、1/nを乗算し、最後に計算できます次のような指数

import numpy as np

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

誰かがここでライブラリの実装を探している場合、scipyには gmean() があります。カスタム実装よりも高速で数値的に安定しています。

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

Python 3.8から、標準ライブラリには statistics モジュールの一部として geometric_mean 関数が付属しています。

from statistics import geometric_mean

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

これを行うだけです:

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


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

これは、基本的に 受け入れられた答え と同じ、ピュアPythonのオーバーフロー耐性バージョンです。

import math

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