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)
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)
从开始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)
就这样做:
numbers = [1, 3, 5, 7, 10]
print reduce(lambda x, y: x*y, numbers)**(1.0/len(numbers))
Run Code Online (Sandbox Code Playgroud)
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)