Czy istnieje algorytm do szacowania mediany, trybu, skośności i / lub kurtozy zbioru wartości, ale NIE wymaga to jednoczesnego przechowywania wszystkich wartości w pamięci?
Chciałbym obliczyć podstawowe statystyki:
- mean: średnia arytmetyczna
- wariancja: średnia kwadratów odchyleń od średniej
- odchylenie standardowe: pierwiastek kwadratowy z wariancji
- mediana: wartość, która oddziela większą połowę liczb od mniejszej połowy
- tryb: najczęstsza wartość znaleziona w zestawie
- skośność: tl; dr
- kurtosis: tl; dr
Podstawowymi formułami do obliczania któregokolwiek z nich są arytmetyka podstawowa i znam je. Istnieje również wiele bibliotek statystyk, które je implementują.
Moim problemem jest duża liczba (miliardy) wartości w zestawach, które obsługuję: pracując w Pythonie, nie mogę po prostu sporządzić listy lub mieszania z miliardami elementów. Nawet jeśli napisałem to w C, tablice zawierające miliardy elementów nie są zbyt praktyczne.
Dane nie są posortowane. Jest wytwarzany losowo, w locie, przez inne procesy. Rozmiar każdego zestawu jest bardzo zmienny, a rozmiary nie będą znane z góry.
Dowiedziałem się już, jak całkiem dobrze radzić sobie ze średnią i wariancją, iterując po każdej wartości w zestawie w dowolnej kolejności. (Właściwie w moim przypadku biorę je w kolejności, w jakiej są generowane). Oto algorytm, którego używam, dzięki uprzejmości http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm :
- Zainicjuj trzy zmienne: count, sum i sum_of_squares
- Dla każdej wartości:
- Liczba przyrostów.
- Dodaj wartość do zsumowania.
- Dodaj kwadrat wartości do sum_of_squares.
- Podzielić sumę przez liczbę, przechowując jako zmienną średnią.
- Podzielić sumę_kwadratów przez liczbę, przechowując jako zmienną średnią_kwadratów.
- Średnia kwadratowa, przechowywana jako kwadrat_średniej.
- Odejmij square_of_mean od mean_of_squares, przechowując jako wariancję.
- Średnia wyjściowa i wariancja.
Ten algorytm „on-line” ma słabe punkty (np. Problemy z dokładnością, ponieważ sum_of_squares szybko rośnie niż zakres liczb całkowitych lub precyzja typu float), ale zasadniczo daje mi to, czego potrzebuję, bez konieczności przechowywania każdej wartości w każdym zestawie.
Ale nie wiem, czy istnieją podobne techniki szacowania dodatkowych statystyk (mediana, mod, skośność, kurtoza). Mógłbym żyć z obciążonym estymatorem lub nawet metodą, która do pewnego stopnia ogranicza dokładność, o ile pamięć wymagana do przetwarzania wartości N jest znacznie mniejsza niż O (N).
Wskazanie mi istniejącej biblioteki statystyk również pomoże, jeśli biblioteka ma funkcje obliczania jednej lub więcej z tych operacji „on-line”.