2012-05-23 25 views
10

Funkcja Średnia harmoniczna w python (scipy.stats.hmean) wymaga, aby dane wejściowe były liczbami dodatnimi.średnia harmoniczna w pytonie

Na przykład:

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

skutkuje:

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

nie matematycznie, dlaczego powinno to być przypadek, z wyjątkiem rzadkich przypadkach, gdzie byś skończyć dzielenie przez zero . Zamiast sprawdzania dzielenia przez zero, hmean() wyrzuca błąd po wprowadzeniu dowolnej liczby dodatniej, niezależnie od tego, czy można znaleźć średnią harmoniczną.

Czy brakuje mi tu czegoś w matematyce? Czy to naprawdę jest ograniczenie w SciPy?

Jak byś poszła o znalezieniu średniej harmonicznej zbioru liczb, które mogą być dodatnie lub ujemne w pytonie?

+3

"Nie rozumiem matematycznie, dlaczego tak powinno być ...", więc masz zasadniczo pytanie matematyczne, a nie pytanie programistyczne. –

+0

.. i pytanie matematyczne, na które wyraźnie udzielono odpowiedzi, ponieważ średnia harmoniczna ma znaczenie tylko dla liczb dodatnich. –

Odpowiedz

21

Średnia harmoniczna jest zdefiniowana tylko dla zestawów dodatnich liczb rzeczywistych. Jeśli spróbujesz to obliczyć dla zestawów z negatywami, otrzymasz wszelkiego rodzaju dziwne i bezużyteczne wyniki, nawet jeśli nie uderzysz div o 0. Na przykład zastosowanie formuły do ​​zestawu (3, -3, 4) daje średnią z 12!

+0

+1 Dobra odpowiedź. Liczby ujemne zmniejszają mianownik, który powoduje zawyżenie wyniku. – Akavall

+1

Dobre wyjaśnienie, dlaczego średnia harmoniczna nie ma absolutnie żadnego sensu dla liczb ujemnych. –

+0

silni (12) ??? ;-) – dpb

1

Definicja matematyczna samej średniej harmonicznej nie zabrania stosowania liczb ujemnych (chociaż nie można obliczyć średniej harmonicznej wynoszącej +1 i -1), jednak ma ona na celu obliczenie średniej dla wielkości takich jak współczynniki tak, aby nadawał równą wagę każdemu punktowi danych, podczas gdy w przypadku środków arytmetycznych lub taki stosunek ekstremalnych punktów danych nabrałby znacznie dużej wagi, a zatem byłby niepożądany.

Więc możesz spróbować samemu zakodować definicję kodu tak, jak sugerował @HYRY, lub zastosować średnią harmoniczną w niewłaściwym kontekście.

1

Jest biblioteka statystyki jeśli używasz Python> = 3.6:

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

Można użyć jej średnią metodę takiego. Powiedzmy, że masz listę numerów, z których chcesz znaleźć myśli:

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

Ma też inne metody, takie jak stdev wariancji, tryb, średnia, mediana etc, które są zbyt użyteczne.