38

我想知道是否有任何简单的方法可以使用 python 但不使用 python 包来计算几何平均值。如果没有,是否有任何简单的包来做几何平均?

4

8 回答 8

56

几何平均值的公式为:

几何平均数

因此,您可以轻松编写如下算法:

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):
    return np.exp(np.log(iterable).mean())
于 2017-03-29T17:00:30.377 回答
36

如果有人在这里寻找库实现,scipy 中有gmean(),可能比自定义实现更快且在数值上更稳定:

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

与 Python 2 和 3 兼容。*

于 2018-11-28T19:00:26.840 回答
27

开始Python 3.8,标准库附带了geometric_mean作为statistics模块一部分的函数:

from statistics import geometric_mean

geometric_mean([1.0, 0.00001, 10000000000.]) // 46.415888336127786
于 2019-04-07T17:55:16.047 回答
5

这是纯 Python 中的防溢出版本,与接受的答案基本相同。

import math

def geomean(xs):
    return math.exp(math.fsum(math.log(x) for x in xs) / len(xs))
于 2019-05-20T22:41:43.187 回答
4

这样做:

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


print reduce(lambda x, y: x*y, numbers)**(1.0/len(numbers))
于 2017-03-29T16:51:08.133 回答
2

您可以使用 pow 函数,如下所示:

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

>>> p(2,3)
2.449489742783178
于 2020-12-25T11:36:52.317 回答
1

您还可以使用 numpy 计算几何平均值:

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

结果:

1.8171205928321397
于 2020-05-12T21:19:26.903 回答
0
几何平均数
import pandas as pd
geomean=Variable.product()**(1/len(Variable))
print(geomean)
Scipy 的几何平均值
from scipy import stats
print(stats.gmean(Variable))
于 2019-10-30T07:02:54.580 回答