18

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

4 回答 4

32

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

于 2012-05-23T03:06:42.797 回答
16

您可以只使用谐波平均值定义方程:

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

但是,维基百科说调和平均值是为正实数定义的:

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

于 2012-05-23T03:00:46.170 回答
7

如果您使用 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)

它也有其他方法,如标准差、方差、众数、均值、中位数等,这些方法也很有用。

于 2017-05-11T08:24:46.887 回答
2

调和平均值的数学定义本身并不禁止应用于负数(尽管您可能不想计算 +1 和 -1 的调和平均值),但是,它旨在计算比率等量的平均值,以便对每个数据点给予相等的权重,而在算术方法或类似方法中,极端数据点的比率会获得很高的权重,因此是不受欢迎的。

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

于 2012-05-23T03:20:14.770 回答