python几何平均计算

时间:2017-12-14 19:37:26

标签: python math statistics

如何以安全的方式在Python中计算并且没有numpy数字列表的几何平均值,所以我确实避免了此函数有时产生的RuntimeWarning

data = [1,2,3,4,5]
result = reduce(mul, data) ** (1 / len(data))

我发现我可以使用这个日志函数来获得相同的结果,但是我遇到了日志函数不接受负值的问题。

result = (1 / len(data)) * sum(list(map(math.log10, data)))

在映射到log10之前,我可以使用abs函数映射数据吗? 还有更好的办法吗?

2 个答案:

答案 0 :(得分:1)

带负数的几何平均值没有明确定义。有几种可用的解决方法取决于您的应用程序。请参阅this以及此paper。要点是:

  1. 当所有数字都是负数时,你可以通过暂时悬挂标志来定义几何平均数,取几何平均值并将它们加回来。
  2. 如果你有正数和负数的混合,如果它们的奇数是负数,那么几何平均值就会变得不确定。在任何情况下,因为你忽略了这些标志,结果并不意味着......
  3. 可以单独评估正面和负面部分计算平均值,然后将它们与paper的一些权重相结合,但准确性将取决于各种因素(也已描述)。
  4. 就代码而言,我没有遇到运行时错误(参见下面的代码)。如果您可以显示代码的示例,我可以尝试重现该代码并更新我的答案。是的,您无法将负值传递给日志,因此您必须在适当的位置采用绝对值(如上所述)。请注意,对于python 2,您必须从__future__()模块导入除法,或者在获取分数幂时使用浮点数,否则您将得到错误的结果。

    >>> data = [1,2,3,4,5]
    >>> import operator
    >>> result = reduce(operator.mul, data) ** (1 / len(data))
    >>> result
    1
    >>> result = reduce(operator.mul, data) ** (1.0 / len(data))
    >>> result
    2.605171084697352
    

答案 1 :(得分:1)

通常负数的第n个根是复数

代码适用于cmath基础e logexponentiation

from functools import reduce
import operator
from cmath import log, e

data = [1,2,3,4,5]

rmul = reduce(operator.mul, data) ** (1 / len(data))

rln = e**((1 / len(data)) * sum(list(map(log, data))))

rmul, rln
Out[95]: (2.605171084697352, (2.6051710846973517+0j))

data = [1,2,3,-4,5]

rmul = reduce(operator.mul, data) ** (1 / len(data))

rln = e**((1 / len(data)) * sum(list(map(log, data))))

rmul, rln
Out[96]: 
((2.1076276807743737+1.531281143283889j),
 (2.1076276807743732+1.5312811432838889j))

一些检查:

abs(rln)
Out[97]: 2.6051710846973517

rln**5
Out[98]: (-120.00000000000003-1.4210854715202004e-14j)

获得更多乐趣和论点:

'正值a的平方根不是单数,而是正数,它是+-有符号值:+/- sqrt(a)

和'负a的'平方根同样是+/- 1j * sqrt(a)