Mam mały problem, który doprowadza mnie do szału. Muszę napisać procedurę dla procesu akwizycji online wielowymiarowych szeregów czasowych. Za każdym razem (na przykład 1 sekundę) otrzymuję nową próbkę, która jest w zasadzie wektorem zmiennoprzecinkowym o rozmiarze N. Operacja, którą muszę wykonać, jest nieco trudna:
Dla każdej nowej próbki obliczam wartości procentowe dla tej próbki (normalizując wektor, aby elementy sumowały się do 1).
Średni wektor procentowy obliczam w ten sam sposób, ale używając wcześniejszych wartości.
Dla każdej przeszłej wartości obliczam bezwzględne odchylenie wektora procentowego związane z tą próbką za pomocą globalnego średniego wektora procentowego obliczonego w kroku 2. W ten sposób absolutne odchylenie jest zawsze liczbą z zakresu od 0 (gdy wektor jest równy średniej wektor) i 2 (gdy jest całkowicie inny).
Używając średniej odchyleń dla wszystkich poprzednich próbek, obliczam średnie odchylenie bezwzględne, które ponownie jest liczbą między 0 a 2.
Używam średniego odchylenia bezwzględnego, aby wykryć, czy nowa próbka jest kompatybilna z innymi próbkami (porównując jej bezwzględne odchylenie ze średnim bezwzględnym odchyleniem całego zestawu obliczonego w kroku 4).
Ponieważ za każdym razem, gdy pobierana jest nowa próbka, zmiany globalnej średniej (a więc również zmiany średniej bezwzględnej odchyłki), czy istnieje sposób na obliczenie tej wartości bez wielokrotnego skanowania całego zestawu danych? (jeden raz do obliczenia średnich globalnych wartości procentowych i jeden raz do zebrania bezwzględnych odchyleń). Ok, wiem, że absolutnie łatwo jest obliczyć średnie globalne bez skanowania całego zestawu, ponieważ po prostu muszę użyć wektora tymczasowego do przechowywania sumy każdego wymiaru, ale co ze średnim absolutnym odchyleniem? Jego obliczenia obejmują abs()
operatora, więc potrzebuję dostępu do wszystkich danych z przeszłości!
Dzięki za pomoc.
źródło
W przeszłości stosowałem następujące podejście do umiarkowanie wydajnego obliczania odchylenia rozgrzeszenia (zauważ, że jest to podejście programistów, a nie statystyków, więc niewątpliwie mogą istnieć sprytne sztuczki, takie jak shabbychef, które mogą być bardziej wydajne).
OSTRZEŻENIE: To nie jest algorytm online. Wymaga
O(n)
pamięci. Co więcej, ma najgorszy wynik wO(n)
przypadku takich zestawów danych[1, -2, 4, -8, 16, -32, ...]
(tj. Taki sam jak w przypadku pełnego przeliczenia). [1]Ponieważ jednak nadal działa dobrze w wielu przypadkach użycia, warto opublikować tutaj. Na przykład, aby obliczyć absolutne odchylenie 10000 losowo liczb od -100 do 100 w miarę dostarczania każdego elementu, mój algorytm zajmuje mniej niż jedną sekundę, podczas gdy pełne ponowne obliczenie zajmuje ponad 17 sekund (na mojej maszynie będą się różnić w zależności od maszyny i zgodnie z danymi wejściowymi). Musisz jednak zachować cały wektor w pamięci, co może być ograniczeniem dla niektórych zastosowań. Zarys algorytmu jest następujący:
O(n)
operacji przenoszenia, w wielu przypadkach użycia tak nie jest.Przykładowy kod w pythonie znajduje się poniżej. Pamiętaj, że pozwala tylko dodawać elementy do listy, a nie usuwać. Można to łatwo dodać, ale w chwili, gdy to pisałem, nie było takiej potrzeby. Zamiast samodzielnie wdrażać kolejki priorytetowe, skorzystałem z sortowanej listy z doskonałego pakietu blist Daniela Stutzbacha , który wykorzystuje B + Tree .
Rozważ ten kod na licencji MIT . Nie został znacznie zoptymalizowany ani dopracowany, ale działał dla mnie w przeszłości. Nowe wersje będą dostępne tutaj . Daj mi znać, jeśli masz jakieś pytania lub znajdziesz jakieś błędy.
[1] Jeśli objawy utrzymują się, skontaktuj się z lekarzem.
źródło
O(n)
pamięci, aw najgorszym przypadku O (n) zajmuje każdy dodany element. W normalnie dystrybuowanych danych (i prawdopodobnie w innych dystrybucjach) działa jednak dość wydajnie.Istnieje również podejście parametryczne. Ignorując wektorową naturę danych i patrząc tylko na marginesy, wystarczy rozwiązać problem: znajdź internetowy algorytm do obliczenia średniego bezwzględnego odchylenia skalaraX . Jeśli (i to jest tutaj duże „jeśli”), tak myślałeśX po pewnym rozkładzie prawdopodobieństwa o nieznanych parametrach można oszacować parametry za pomocą algorytmu online, a następnie obliczyć średnie bezwzględne odchylenie na podstawie tego sparametryzowanego rozkładu. Na przykład, jeśli tak myślałeśX był (w przybliżeniu) normalnie rozłożony, można oszacować jego odchylenie standardowe, jak s , a średnie bezwzględne odchylenie zostanie oszacowane na podstawie s 2 / π---√ (patrz Połowa rozkładu normalnego ).
źródło
MAD (x) to tylko dwa równoległe obliczenia mediany, z których każde można wykonać online za pomocą algorytmu binmedian .
Powiązany artykuł, a także kod C i FORTRAN można znaleźć tutaj .
(jest to po prostu zastosowanie sprytnej sztuczki na szczycie sprytnej sztuczki Shabbychef, aby zaoszczędzić na pamięci).
Uzupełnienie:
Istnieje wiele starszych wieloprzebiegowych metod obliczania kwantyli. Popularnym podejściem jest utrzymywanie / aktualizowanie wyznaczonego rozmiaru zbiornika obserwacji losowo wybranych ze strumienia i rekurencyjne obliczanie kwantyli (patrz ten przegląd) na tym zbiorniku. To (i powiązane) podejście zastępuje to zaproponowane powyżej.
źródło
Poniżej podano niedokładne przybliżenie, chociaż niedokładność będzie zależeć od rozkładu danych wejściowych. Jest to algorytm online, ale tylko przybliża absolutne odchylenie. Opiera się na dobrze znanym algorytmie obliczania wariancji online, opisanym przez Welforda w latach 60. Jego algorytm, przetłumaczony na R, wygląda następująco:
Działa bardzo podobnie do wbudowanej funkcji wariancji R:
Modyfikacja algorytmu w celu obliczenia absolutnego odchylenia wymaga po prostu dodatkowego
sqrt
wywołania. Jednakżesqrt
wprowadza nieścisłości, które znajdują odzwierciedlenie w wyniku:Błędy, obliczone jak wyżej, są znacznie większe niż w przypadku obliczania wariancji:
Jednak w zależności od przypadku użycia ta wielkość błędu może być do zaakceptowania.
źródło
n
staje się duży,error/n
staje się znikomo mały, zaskakująco szybko.sqrt
niedokładności. Jest tak, ponieważ wykorzystuje szacunkową średnią bieżącą. Aby zobaczyć, kiedy to się zepsuje, spróbujxs <- sort(rnorm(n.testitems))
Kiedy spróbuję tego z twoim kodem (po naprawieniu go w celu powrotua.dev / n
), otrzymuję błędy względne rzędu 9% -16%. Tak więc ta metoda nie jest niezmienna permutacji, co mogłoby spowodować spustoszenie ...