Гармоническое среднее в питоне

Функция Harmonic Mean в Python (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?

Ответ 1

Гармоническое среднее определяется только для множеств положительных действительных чисел. Если вы попытаетесь вычислить его для наборов с негативами, вы получите всевозможные странные и бесполезные результаты, даже если вы не нажмете div на 0. Например, применение формулы к набору (3, -3, 4) дает среднее значение из 12!

Ответ 2

Вы можете просто использовать уравнение определения гармонических сред:

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

Но, Википедия говорит, что гармоническое среднее определено для положительных действительных чисел:

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

Ответ 3

математическое определение самого гармонического значения само по себе не запрещает приложения к отрицательным числам (хотя вы не можете рассчитывать среднее гармоническое значение +1 и -1), однако оно предназначено для вычисления среднего значения таких величин, как отношения что он будет давать равный вес каждой точке данных, в то время как в арифметических средствах или такое отношение экстремальных точек данных будет приобретать большой вес и, следовательно, нежелательно.

Таким образом, вы можете либо попытаться жестко определить определение самостоятельно, как предлагалось @HYRY, или, возможно, применили гармоническое среднее в неправильном контексте.

Ответ 4

Существует библиотека статистики, если вы используете 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 и т.д., которые слишком полезны.