Aby pobrać k losowych liczb z tablicy o nieokreślonym rozmiarze, używamy techniki zwanej próbkowaniem zbiorników. Czy ktokolwiek może krótko podkreślić, jak to się dzieje w przypadku przykładowego kodu?Próbkowanie zbiorników
Odpowiedz
I rzeczywiście nie zdawali sobie sprawy było imię tego, więc to udowodnione i realizowane od podstaw:
import random
def random_subset(iterator, K):
result = []
N = 0
for item in iterator:
N += 1
if len(result) < K:
result.append(item)
else:
s = int(random.random() * N)
if s < K:
result[ s ] = item
return result
z dowodem blisko końca.
@Larry: Gdzie jest 'accept to z prawdopodobieństwem s/k "częścią twojego kodu? [cytat z algorytmu wymienionego na http://blogs.msdn.com/spt/archive/2008/02/05/reservoir-sampling.aspx] – Lazer
Przez przypadek wydaje mi się, że między tym artykułem a moim używamy tych samych zmiennych , ale na różne rzeczy. Moje "K" wydaje się być ich "S", a moje "N" (w kodzie) wydaje się być ich "K". Innymi słowy, akceptuję rzeczy z prawdopodobieństwem 'K/N', gdzie N jest aktualną liczbą rzeczy. – Larry
co miałem zamiar zapytać, to w jaki sposób wprowadziłeś prawdopodobieństwo w swoim kodzie. Tak czy inaczej, teraz rozumiem. Dzięki! – Lazer
Java
import java.util.Random;
public static void reservoir(String filename,String[] list)
{
File f = new File(filename);
BufferedReader b = new BufferedReader(new FileReader(f));
String l;
int c = 0, r;
Random g = new Random();
while((l = b.readLine()) != null)
{
if (c < list.length)
r = c++;
else
r = g.nextInt(++c);
if (r < list.length)
list[r] = l;
b.close();}
}
To pytanie już ma akceptowaną odpowiedź od * lat * temu ... – alestanis
Po Knutha (1981) opis dokładniej, zbiornik Sampling (algorytm R) mogą być realizowane w następujący sposób:
import random
def sample(iterable, n):
"""
Returns @param n random items from @param iterable.
"""
reservoir = []
for t, item in enumerate(iterable):
if t < n:
reservoir.append(item)
else:
m = random.randint(0,t)
if m < n:
reservoir[m] = item
return reservoir
Jaka jest różnica między tą a [zaakceptowaną odpowiedzią] (http://stackoverflow.com/a/2612822/481584)? Myślę, że to dokładnie to samo, nawet jeśli ten kod jest bardziej elegancki. –
Może to być bezpośrednio związane z opublikowanymi badaniami ([Knuth, 1981] (https://github.com/djtrack16/thyme/blob/master/computer%20science/Donald.E.Knuth.The.Art.of.Computer. Programming.Volume.2.pdf)), na wypadek gdyby ktoś był zainteresowany bardziej rozszerzonym wyjaśnieniem lub dowodem Knutha. – sam
- 1. Próbkowanie warstwowe w pandach
- 2. ważona losowe próbkowanie w Elasticsearch
- 3. Ponowne próbkowanie z okresami niestandardowymi
- 4. Zmiana rozmiaru obrazu 3D (i ponowne próbkowanie)
- 5. Próbkowanie frameworka opartego na danym rozkładzie
- 6. Dane szeregów czasowych w MySQL: próbkowanie
- 7. Wybierz losowe próbkowanie z sqlserver szybko
- 8. GLSL Vertex Shader dwuliniowe próbkowanie wysokość mapa
- 9. próbkowanie losowych wartości liczbowych w zakresie numpy
- 10. Dołącz do tabeli danych przez próbkowanie
- 11. Łatwy, skryptowalny sposób na próbkowanie niestrukturalnych danych THREDDS?
- 12. Losowe próbkowanie procentowej liczby wierszy w ramce danych
- 13. Jaki jest najlepszy sposób na próbkowanie/profilowanie aplikacji PyObjC?
- 14. Wyłącz próbkowanie danych aplikacji za pomocą bibliotek podstawowych ASP.NET Core
- 15. Jednoczesne działanie grupy i ponowne próbkowanie na ramce danych pandy?
- 16. Algorytmy do efektywnego "skalowania" lub "zmiany rozmiaru" tablicy liczb (próbkowanie dźwiękowe)
- 17. próbkowanie losowe nie zachodzące na siebie ciągów znaków o długości k
- 18. Jak dobry jest VTK?
- 19. Losowe pobieranie próbek z Mongo
- 20. Jak dokonać ponownej próby porównania pliku df z indeksem datetime do dokładnie n równych okresów?
- 21. Co oznacza liczba całkowita podczas ustawiania wielkości początkowej?
- 22. Profilowanie długo działającego serwera Pythona
- 23. losowanie warstwowe z lasy losowe w R
- 24. Czy to prawidłowy projekt synchronizacji synchronicznej?
- 25. Zapisywanie 8-bitowego pliku WAV fal sinusoidalnych PCM wytwarza podteksty
- 26. Mikrofon nie działa na iOS 7
- 27. Kliknij przycisk zdarzenie nie jest wypalanie ale modalpopupextender pracuje
- 28. Jak połączyć kontenery dokerów w VM kontenera z manifestem?
- 29. Różnice w sterownikach nvidii 275,50 i 280,19 dla procesora graficznego GTX480 w próbie opencl
- 30. Zmiana sceny/wykrywanie strzału/wyodrębnianie obrazu za pomocą ffmpeg z wideo
pokrewne pytanie http://stackoverflow.com/questions/54059/efektywny wybór-losowy-elementów-z-połączonej listy –
[Ta strona] (http://blogs.msdn.com/spt/archive/2008/02/05/ reservoir-sampling.aspx) zawiera dobre objaśnienie z pseudokodem. (Strona, do której pierwotnie linkowałem, jest niejasna, a pseudo-kod jest niekompletny.) –
Napisałem wpis na blogu o tym, co kilka miesięcy temu, który ma implementację C#: http://gregbeech.com/ blog/sampling-very-large-sequence Najlepszy opis tego, jak to działa, znajduje się tutaj: http://gregable.com/2007/10/reservoir-sampling.html –