2013-06-14 8 views
13

Czy istnieje algorytm wykonywania próbkowania w zbiorniku, gdy punkty w strumieniu danych mają powiązane wagi?Czy istnieje algorytm ważonego pobierania próbek w zbiorniku

+9

Zbyt szeroki? Myślę, że pytanie wymaga bardzo specyficznego algorytmu. –

+5

Całkowicie zgadzam się z @ JuanA.Navarro - pytanie jest bardzo przydatne do przetwarzania strumieniowego lub równoległego i powinno zostać ponownie otwarte (jego odpowiedź jest również bardzo dobra, BTW). –

Odpowiedz

13

Algorytm Pavlos Efraimidis i Pawła Spirakis dokładnie rozwiązuje ten problem. Oryginalny papier z pełnymi dowodami jest publikowany pod tytułem "Ważone losowe pobieranie próbek ze zbiornikiem" w Information Processing Letters 2006, ale można znaleźć proste podsumowanie here.

Algorytm działa w następujący sposób. Po pierwsze, należy zauważyć, że innym sposobem rozwiązania nieważonego próbkowania zbiorników jest przypisanie każdemu elementowi losowego identyfikatora R od 0 do 1 i przyrostowe (powiedzmy za pomocą sterty) śledzenie najwyższych wartości k. Teraz spójrzmy na wersję ważoną, powiedzmy, że i-ten element ma wagę w_i. Następnie modyfikujemy algorytm, wybierając ID i-tego elementu na R^(1/w_i), gdzie R jest równomiernie rozłożone w (0,1).

Kolejny artykuł mówiący o tym algorytmie to this one autorstwa Cloudera.

+4

I jedna liniowa implementacja python: 'heapq.nlargest (k, items, key = element lambdy: math.pow (random.random(), 1/weight (item)))' –

+0

Czy można to zrobić z wymianą ? – eleanora

+0

@eleanora Nie ma sensu robić tego z zamiennikiem, ponieważ istnieje metoda aliasu, musisz najpierw utworzyć tabelę, która zajmuje O (n) czas, a następnie każdy wybór to O (1). Alias ​​nie zachowuje jednak złożoności środowiska wykonawczego przy wyborze, chyba że użyje się go z zamiennikiem. – snb

Powiązane problemy