Solidne oszacowanie średnie z wydajnością aktualizacji O (1)

9

Szukam dokładnego oszacowania średniej, która ma określoną właściwość. Mam zestaw elementów, dla których chcę obliczyć tę statystykę. Następnie dodaję nowe elementy pojedynczo i dla każdego dodatkowego elementu chciałbym ponownie obliczyć statystyki (znane również jako algorytm online). Chciałbym, aby to obliczenie aktualizacji było szybkie, najlepiej O (1), tzn. Nie zależy od wielkości listy.

Zwykły środek ma tę właściwość, że może być skutecznie aktualizowany, ale nie jest odporny na wartości odstające. Typowe solidne estymatory średniej, takie jak średnia między kwartylami i średnia obcięta, nie mogą być skutecznie aktualizowane (ponieważ wymagają utrzymania posortowanej listy).

Byłbym wdzięczny za wszelkie sugestie dotyczące solidnych statystyk, które można skutecznie obliczać / aktualizować.

Bitowe
źródło
Dlaczego po prostu nie wykorzystać początkowego segmentu danych - takiego jak pierwsze 100 lub pierwsze 1000 lub cokolwiek innego - do wzniesienia „ogrodzeń” do prześwietlania wartości odstających? Nie musisz ich ponownie aktualizować, więc nie musisz utrzymywać dodatkowych struktur danych.
whuber
@ whuber Nie mogę zagwarantować, że początkowa próbka będzie reprezentować resztę danych. Na przykład kolejność, w jakiej otrzymuję dane, nie jest losowa (wyobraź sobie scenariusz, w którym najpierw otrzymuję wyższe wartości, a następnie niższe).
Bitowe
1
To kluczowa obserwacja. Oznacza to, że musisz zachować większą ostrożność niż zwykle, ponieważ początkowo uzyskasz „solidną” ocenę średnich wysokich wartości odstających. Kontynuując aktualizację tego oszacowania, możesz skończyć z wyrzucaniem wszystkich niższych wartości. Potrzebna będzie zatem struktura danych, w której kluczowe części całej dystrybucji danych są rejestrowane i okresowo aktualizowane. Sprawdź nasze wątki ze słowami kluczowymi „online” i „kwantyl” dla pomysłów. Dwa takie obiecujące znajdują się na stronie stats.stackexchange.com/questions/3372 i stats.stackexchange.com/q/3377 .
whuber
Oferowałbym nagrodę, ale nie mam wystarczającej reputacji
Jason S
1
Aby kontynuować ideę z pierwszego komentarza @ whuber, możesz zachować jednolicie próbkowany losowy podzbiór o wielkości lub ze wszystkich dotychczas widzianych danych. Ten zestaw i związane z nim „ogrodzenia” można zaktualizować w czasie O (1). 1001000
Innuo

Odpowiedzi:

4

To rozwiązanie implementuje sugestię @Innuo w komentarzu do pytania:

Możesz zachować jednolicie próbkowany losowy podzbiór o wielkości 100 lub 1000 na podstawie wszystkich danych do tej pory obserwowanych. Ten zestaw i związane z nim „ogrodzenia” można zaktualizować w czasie .O(1)

Kiedy już wiemy, jak zachować ten podzbiór, możemy wybrać dowolną metodę, którą chcemy oszacować średnią populacji z takiej próby. Jest to metoda uniwersalna, nie zakładająca żadnych założeń, która będzie działać z dowolnym strumieniem wejściowym z dokładnością, którą można przewidzieć za pomocą standardowych wzorów statystycznego próbkowania. (Dokładność jest odwrotnie proporcjonalna do pierwiastka kwadratowego z wielkości próby).


Ten algorytm przyjmuje jako dane wejściowe strumień danych wielkość próbki , i wysyła strumień próbek z których każda reprezentuje populację . W szczególności dla , jest prostą losową próbką o rozmiarze z (bez zamiany).x(t), t=1,2,,ms(t)X(t)=(x(1),x(2),,x(t))1its(i)mX(t)

W tym stanie, wystarczy, że każdy -elementowe podzbiór mają równe prawdopodobieństwo być indeksów w . Oznacza to szansę, że jest w równa się pod warunkiem, że .m{1,2,,t}xs(t)x(i), 1i<t,s(t)m/ttm

Na początku zbieramy strumień, dopóki nie zostanie zapisanych elementów. W tym momencie istnieje tylko jedna możliwa próbka, więc warunek prawdopodobieństwa jest trywialnie spełniony.m

Algorytm przejmuje, gdy . Indukcyjnie załóżmy, że jest prostą losową próbką dla . Wstępnie ustawione . Niech będzie jednolitą zmienną losową (niezależną od poprzednich zmiennych używanych do konstruowania ). Jeśli to zamień losowo wybrany element na . To cała procedura!t=m+1s(t)X(t)t>ms(t+1)=s(t)U(t+1)s(t)U(t+1)m/(t+1)sx(t+1)

Wyraźnie ma prawdopodobieństwo przebywania w . Ponadto, zgodnie z hipotezą indukcyjną, miało prawdopodobieństwo bycia gdy . Z prawdopodobieństwem = zostanie on usunięty ze , stąd prawdopodobieństwo pozostania równex(t+1)m/(t+1)s(t+1)x(i)m/ts(t)itm/(t+1)×1/m1/(t+1)s(t+1)

mt(11t+1)=mt+1,

dokładnie w razie potrzeby. Dzięki indukcji wszystkie prawdopodobieństwa włączenia w są prawidłowe i jasne jest, że nie ma specjalnej korelacji między tymi wtrąceniami. To dowodzi, że algorytm jest poprawny.x(i)s(t)

Efektywność algorytmu wynosi ponieważ na każdym etapie obliczane są co najwyżej dwie liczby losowe i co najwyżej jeden element tablicy wartości jest zastępowany. Wymagane miejsce to .O(1)mO(m)

Struktura danych dla tego algorytmu składa się z próbki wraz z indeksem populacji , którą próbkuje. Początkowo bierzemy i postępujemy zgodnie z algorytmem dla Oto implementacja do aktualizacji o wartości do wyprodukowania . (Argument odgrywa rolę i jest . Indeks będzie utrzymywana przez dzwoniącego).stX(t)s=X(m)t=m+1,m+2,.R(s,t)x(s,t+1)ntsample.sizemt

update <- function(s, x, n, sample.size) {
  if (length(s) < sample.size) {
    s <- c(s, x)
  } else if (runif(1) <= sample.size / n) {
    i <- sample.int(length(s), 1)
    s[i] <- x
  }
  return (s)
}

Aby to zilustrować i przetestować, użyję zwykłego (nieelastycznego) estymatora średniej i porównuję średnią oszacowaną na podstawie z rzeczywistą średnią (skumulowany zestaw danych widoczny na każdym etapie ). Wybrałem nieco trudny strumień wejściowy, który zmienia się dość płynnie, ale okresowo przechodzi dramatyczne skoki. Wielkość próby jest dość mała, co pozwala nam zobaczyć fluktuacje próbkowania na tych wykresach.s(t)X(t)m=50

n <- 10^3
x <- sapply(1:(7*n), function(t) cos(pi*t/n) + 2*floor((1+t)/n))
n.sample <- 50
s <- x[1:(n.sample-1)]
online <- sapply(n.sample:length(x), function(i) {
  s <<- update(s, x[i], i, n.sample)
  summary(s)})
actual <- sapply(n.sample:length(x), function(i) summary(x[1:i]))

W tym momencie onlinejest sekwencja średnich oszacowań uzyskanych przez utrzymanie tej bieżącej próbki wartości, podczas gdy jest sekwencją średnich oszacowań uzyskanych ze wszystkich danych dostępnych w każdym momencie. Wykres pokazuje dane (w kolorze szarym), (w kolorze czarnym) i dwa niezależne zastosowania tej procedury próbkowania (w kolorach). Umowa mieści się w oczekiwanym błędzie próbkowania:50actualactual

plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")

Postać


Aby uzyskać wiarygodne estymatory średniej, wyszukaj naszą stronę w poszukiwaniu i powiązane warunki. Wśród możliwości wartych rozważenia są środki Winsorized i estymatory M.

Whuber
źródło
nie jest dla mnie jasne, jak wygląda próg odrzucenia w tym podejściu (np. próg, powyżej którego obserwacje są odrzucane jako wartości odstające). Czy możesz dodać je do fabuły?
user603
@ user603 „Próg odrzucenia” lub jakakolwiek solidna metoda zastosowana do oszacowania średniej, nie ma znaczenia: wybierz dowolną metodę, którą chcesz oszacować średnią. (Nie wszystkie solidne metody działają, ustawiając progi i odrzucając dane, BTW.) Można to zrobić w kodzie mojej odpowiedzi, zastępując summarysolidny wariant.
whuber
Coś nie jest dla mnie jasne w tym przykładzie. Czy szare dane są „dobre” lub „wartości odstające”. Jeśli wcześniejsze, wydaje się, że dopasowanie jest stronnicze (powinno pasować do nich lepiej, ponieważ sytuacja byłaby podobna do trendu spadkowego @ Bitwise, który chcielibyśmy śledzić). Jeśli szare dane przy wyższych wartościach indeksu są odstające, to wydaje się, że dopasowanie jest tendencyjne w górę. Jaki cel chcesz tu dopasować? Obecne dopasowanie wydaje się rozdarte między tymi dwoma scenariuszami.
Deathkill14
@Death Jak wyjaśniono w tekście bezpośrednio poprzedzającym rysunek, szare dane są oryginalnym strumieniem danych. Jego średnią bieżącą jest czarna krzywa. Kolorowe krzywe są oparte na algorytmie. Odchylenia w pionie kolorowych krzywych względem czarnej krzywej wynikają z losowości w próbkowaniu. Oczekiwana wielkość odchylenia przy dowolnym wskaźniku jest proporcjonalna do odchylenia standardowego wartości szarości poprzedzających ten wskaźnik i odwrotnie proporcjonalna do pierwiastka kwadratowego z wielkości próby (przyjęta jako 50 w tym przykładzie).
whuber
3

Możesz pomyśleć o powiązaniu swojego problemu z problemem rekurencyjnej karty kontrolnej. Taki wykres kontrolny ocenia, czy nowa obserwacja jest pod kontrolą. Jeśli tak, to obserwacja ta jest uwzględniona w nowym oszacowaniu średniej i wariancji (niezbędnym do ustalenia limitów kontrolnych).

Niektóre informacje na temat solidnych, rekurencyjnych, jednowymiarowych wykresów kontrolnych można znaleźć tutaj . Jeden z klasycznych tekstów na temat kontroli jakości i tabel kontroli wydaje się być dostępny tutaj online .

Intuicyjnie, wykorzystując jako dane wejściowe średnią, i wariancję , możesz określić, czy nowa obserwacja w czasie jest wartością odstającą na podstawie wielu podejść. Można by zadeklarować wartość odstającą, jeśli jest ona poza pewną liczbą standardowych odchyleń (biorąc pod uwagę , ale może to mieć problemy, jeśli dane niezgodne z niektórymi założeniami dystrybucyjnymi. Jeśli chcesz iść tą drogą, załóżmy, że ustaliłeś, czy nowy punkt nie jest wartością odstającą, i chciałbyś uwzględnić go w swoich średnich szacunkach bez specjalnego wskaźnika zapominania. Nie możesz zrobić nic lepszego niż:μt1σt12txtμt1σt12)

μt=t1tμt1+1txt

Podobnie musisz zaktualizować wariancję rekurencyjnie:

σt2=t1tσt12+1t1(xtμt)2

Możesz jednak wypróbować bardziej konwencjonalne tabele kontrolne. Zalecane są inne wykresy kontrolne, które są bardziej odporne na dystrybucję danych i mogą nadal obsługiwać niestacjonarność (np. twojego procesu powoli idzie wyżej), są EWMA lub CUSUM (więcej informacji na ten temat znajduje się w podręczniku do którego prowadzi link wykresy i ich granice kontroli). Metody te będą zwykle mniej obciążające obliczeniowo niż niezawodne, ponieważ mają tę zaletę, że po prostu muszą porównać jedną nową obserwację z informacjami uzyskanymi z obserwacji nietypowych. Możesz sprecyzować swoje szacunki dotyczące długoterminowego procesu i wykorzystywanego w obliczeniach limitów kontrolnych tych metod za pomocą formuł aktualizacyjnych podanych powyżej, jeśli chcesz.μμσ2

Jeśli chodzi o wykres podobny do EWMA, który zapomina o starych obserwacjach i nadaje większą wagę nowym, jeśli uważasz, że twoje dane są nieruchome (co oznacza, że ​​parametry rozkładu generującego nie zmieniają się), nie ma potrzeby, by zapomnieć o starszych obserwacjach wykładniczo. Możesz odpowiednio ustawić współczynnik zapominania. Jeśli jednak uważasz, że to niestacjonarność, musisz wybrać dobrą wartość dla czynnika zapominania (ponownie zobacz podręcznik, jak to zrobić).

Powinienem również wspomnieć, że zanim zaczniesz monitorować i dodawać nowe obserwacje online, będziesz musiał uzyskać oszacowania i (początkowe wartości parametrów oparte na zbiorze danych szkoleniowych), na które nie mają wpływu wartości odstające. Jeśli podejrzewasz, że w danych treningowych występują wartości odstające, możesz zapłacić jednorazowy koszt użycia solidnej metody ich oszacowania.μ0σ02

Myślę, że takie podejście doprowadzi do najszybszej aktualizacji Twojego problemu.

Deathkill14
źródło
1
Korzystanie z kart kontrolnych jest interesującym pomysłem. Wydaje się jednak, że pokonanie wyzwań przedstawionych w komentarzach do pytania może być trudne. W przypadku niestacjonarnym, jeśli „zapominamy” o starszych wartościach, wydaje się możliwe, że szacunki mogą być bardzo stronnicze. Na przykład, jak zareagują Twoje sugestie na strumieniu danych podanym przez ? (To spada bardzo stopniowo, nagle podskakuje i podnosi się bardzo stopniowo, nagle znowu podskakuje i tak dalej.)xt=cos(πt/106)+2t/106
whuber
@ Bitwise twierdzi, że początkowa próbka może nie reprezentować przyszłych danych. Bez informacji o tym, jak różne będą pozostałe dane, zasadniczo nie możesz nic zrobić. Jeśli jednak początkowe dane zawierają informacje o niestacjonarności procesu (powiedzmy tendencję spadkową), można dopuścić nowe obserwacje, uwzględniając fakt, że spodziewamy się, że będą niższe. Potrzebne są jednak pewne informacje na temat niestacjonarności. Proponujesz jeden patologiczny rodzaj niestacjonarności. Niektóre metody, np. EWMA, są optymalne dla określonego procesu, ale ogólnie są całkiem dobre. Twój proces wymagałby bardziej niestandardowej pracy.
Deathkill14
(Wykryłem w tobie matematyka, ponieważ odrzucenie go jako „patologicznego” jest bardzo matematycznym ruchem, z którym nie można sobie poradzić :-). Ale zaczynam się różnić od twoich prognoz: metody takie jak te sugerowane przez @Innuo mogą rzeczywiście chronić przed takimi „patologiami” i wszystkim innym, co może rzucić na ciebie prawdziwy świat, szczególnie gdy losowanie jest włączone do próbkowania.
whuber
Właściwie zgadzam się, że nie należy lekceważyć problemu, przed którym się staje. Czy możesz podać link do omawianych metod @Innuo (nie mogę ich znaleźć w tym poście - czy znajdowały się w linkach, które podałeś powyżej, i mi ich brakowało?). Dziękuję Ci.
Deathkill14
@Innuo opublikował krótki komentarz na stronie stats.stackexchange.com/questions/56494/... sugerujący, że jednolitą losową próbkę wszystkich wcześniej zaobserwowanych danych można utrzymać w czasie . Chociaż nie jest całkiem jasne, w jaki sposób można to zrobić, połączenie go z solidnym estymatorem średniej stanowiłoby uniwersalne rozwiązanie, które można by zastosować do dowolnego strumienia danych. O(1)
whuber