Python:在python中做几何平均的简单方法?

18 python math statistics geometric-mean

我想知道有没有简单的方法来使用python做几何意义但不使用python包.如果没有,是否有任何简单的包做几何意味着什么?

Wil*_*sem 35

几何平均值的公式是:

几何平均数

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

import numpy as np

def geo_mean(iterable):
    a = np.array(iterable)
    return a.prod()**(1.0/len(a))
Run Code Online (Sandbox Code Playgroud)

您不必为此使用numpy,但它往往比Python更快地对数组执行操作(因为使用转换时"开销"较少).

如果溢出的可能性很高,您可以先将数字映射到日志域,计算这些日志的总和,然后乘以1/n,最后计算指数,如:

import numpy as np

def geo_mean_overflow(iterable):
    a = np.log(iterable)
    return np.exp(a.sum()/len(a))
Run Code Online (Sandbox Code Playgroud)

  • 为此使用日志做得很好.人们经常忘记溢出. (5认同)
  • @BhabaniMohapatra:浮点数具有固定的位数。因此,它可以表示固定数量的值。溢出是一种状态,您可以在其中计算一个不再能表示的数字。Python使用64位浮点数,因此最大值为1.7976931348623157e + 308。尽管这相当大,但是如果我们不使用日志,并且例如有310个数字(每个数字大约为10),则可能已经发生溢出。 (2认同)

Mar*_*ski 16

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

>>> from scipy.stats.mstats import gmean
>>> gmean([1.0, 0.00001, 10000000000.])
46.415888336127786
Run Code Online (Sandbox Code Playgroud)


Xav*_*hot 6

从开始Python 3.8,标准库随模块一起提供了该geometric_mean功能statistics

from statistics import geometric_mean

geometric_mean([1.0, 0.00001, 10000000000.]) // 46.415888336127786
Run Code Online (Sandbox Code Playgroud)


Lia*_*iam 5

就这样做:

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


print reduce(lambda x, y: x*y, numbers)**(1.0/len(numbers))
Run Code Online (Sandbox Code Playgroud)


rmm*_*mmh 5

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

import math

def geomean(xs):
    return math.exp(math.fsum(math.log(x) for x in xs) / len(xs))
Run Code Online (Sandbox Code Playgroud)