2012-05-23 73 views
10

Python中的谐波均值函数(scipy.stats.hmean)要求输入为正数。python中的谐波均值

例如:

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有正面或负面影响的数字的调和平均值?

+3

“我不会在数学上明白为什么这应该是这种情况......”所以你从根本上有一个数学问题,而不是一个编程问题。 –

+0

..和一个数学问题,这是清楚地回答,因为调和平均值只对正数有意义。 –

回答

21

调和平均值只被定义为正实数的集合。如果你尝试计算带负值的集合,即使你没有将div打到0,你也会得到各种奇怪而无用的结果。例如,将公式应用到集合(3,-3,4)中给出了一个均值12!

+0

+1好答案。负数会减小分母,从而扩大结果。 – Akavall

+1

为什么调和平均值对负数绝对没有意义。 – 2012-05-23 03:36:06

+0

阶乘(12)??? ;-) – dpb

1

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

因此,您可以尝试像@HYRY所建议的那样自己对定义进行硬编码,或者可能在错误的上下文中应用了调和平均值。

1

有一个统计库,如果你正在使用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) 

它有其他的方法太像标准偏差,方差,模式,平均值,中位数等,这是太有用了。