python中的调和平均值

时间:2012-05-23 02:53:18

标签: python math statistics scipy mean

Python中的Harmonic Mean函数(scipy.stats.hmean)要求输入为正数。

例如:

from scipy import stats
print stats.hmean([ -50.2 , 100.5 ])

结果:

ValueError: Harmonic mean only defined if all elements greater than zero

我没有在数学上看到为什么会出现这种情况,除了罕见的情况,你最终将除以零。 hmean()不是检查除以零,而是在输入任何正数时抛出错误,无论是否可以找到调和均值。

我在数学中遗漏了什么吗?或者这是SciPy中的限制吗?

你如何找到一组数字的调和平均值,这些数字在python中可能是正数还是负数?

4 个答案:

答案 0 :(得分:27)

调和平均值仅针对正实数组定义。如果你尝试用负数计算它,你就会得到各种奇怪和无用的结果,即使你没有将div命中为0.例如,将公式应用于集合(3,-3,4)给出了一个意思12!

答案 1 :(得分:11)

你可以使用谐波均值定义方程:

len(a) / np.sum(1.0/a) 

但是,维基百科说谐波均值是为正实数定义的:

http://en.wikipedia.org/wiki/Harmonic_mean

答案 2 :(得分:3)

如果您使用的是Python> = 3.6:

,则有一个统计库

https://docs.python.org/3/library/statistics.html

你可以使用像这样的平均方法。让我们假设您有一个您想要找到的数字列表:

list = [11, 13, 12, 15, 17]
import statistics as s
s.harmonic_mean(list)

它有其他方法,如stdev,variance,mode,mean,median等,这些方法太有用了。

答案 3 :(得分:2)

调和均值本身的数学定义并不禁止应用于负数(尽管您可能不想计算+1和-1的调和平均值),但是,它设计用于计算比率等的均值它会对每个数据点赋予相同的权重,而在算术平均值或者这样的极端数据点的比例会获得很高的权重,因此是不希望的。

所以你要么像@HYRY建议的那样自己硬编码定义,要么可能在错误的语境中应用了调和均值。