【问题标题】:Python : easy way to do geometric mean in python?Python:在python中做几何平均值的简单方法?
【发布时间】:2017-08-23 07:07:52
【问题描述】:

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

【问题讨论】:

标签: python math statistics geometric-mean


【解决方案1】:

几何均值的公式为:

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

import numpy as np

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

您不必为此使用 numpy,但它往往比 Python 更快地对数组执行操作。见this answer for why

如果溢出的几率很高,可以先将数字映射到一个log域,计算这些log的总和,然后乘以1/n最后计算指数,如:

import numpy as np

def geo_mean_overflow(iterable):
    return np.exp(np.log(iterable).mean())

【讨论】:

  • 为此使用日志做得很好。人们经常忘记溢出。
  • 什么是溢出?
  • @BhabaniMohapatra:浮点数具有固定位数。因此它可以表示固定数量的值。溢出是您计算无法再表示的数字的位置。 Python 使用 64 位浮点数,这意味着最大值为 1.7976931348623157e+308。虽然这相当大,但如果我们不使用日志,例如我们有 310 个数字,每个数字都在 10 左右,那么溢出可能已经发生。
  • 您能否评论a.sum()sum(a) 之间的区别,因为它与效率或过低有关?为什么不写np.exp(a.mean())(最后一行)?谢谢。
【解决方案2】:

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

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

兼容 Python 2 和 3.*

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 很好 - 这将适用于任何 Python >= 3.8,包括无法/实际安装其他软件包(如 numpy)的系统。
    【解决方案4】:

    这里是纯Python的防溢出版本,和the accepted answer基本一样。

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

    【讨论】:

      【解决方案5】:

      这样做:

      numbers = [1, 3, 5, 7, 10]
      
      
      print reduce(lambda x, y: x*y, numbers)**(1.0/len(numbers))
      

      【讨论】:

      • 现在是正确的。但是请注意,使用reduce(..) 会引入一些计算开销。
      【解决方案6】:

      你可以使用 pow 函数,如下:

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

      【讨论】:

        【解决方案7】:

        你也可以用 numpy 计算几何平均值:

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

        结果:

        1.8171205928321397
        

        【讨论】:

          【解决方案8】:
          几何平均数
          import pandas as pd
          geomean=Variable.product()**(1/len(Variable))
          print(geomean)
          
          Scipy 的几何平均值
          from scipy import stats
          print(stats.gmean(Variable))
          

          【讨论】:

            猜你喜欢
            • 2020-03-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-17
            • 1970-01-01
            • 1970-01-01
            • 2018-03-16
            相关资源
            最近更新 更多