Mam pewne spostrzeżenia i chcę naśladować próbkowanie na podstawie tych spostrzeżeń. Rozważam tutaj model nieparametryczny, w szczególności używam wygładzania jądra, aby oszacować CDF na podstawie ograniczonych obserwacji, a następnie losowo dobieram wartości z uzyskanego CDF. Oto mój kod (chodzi o to, aby losowo uzyskać kumulatywny prawdopodobieństwo za pomocą równomiernego rozkładu i weź odwrotność CDF w stosunku do wartości prawdopodobieństwa)
x = [randn(100, 1); rand(100, 1)+4; rand(100, 1)+8];
[f, xi] = ksdensity(x, 'Function', 'cdf', 'NUmPoints', 300);
cdf = [xi', f'];
nbsamp = 100;
rndval = zeros(nbsamp, 1);
for i = 1:nbsamp
p = rand;
[~, idx] = sort(abs(cdf(:, 2) - p));
rndval(i, 1) = cdf(idx(1), 1);
end
figure(1);
hist(x, 40)
figure(2);
hist(rndval, 40)
Jak pokazano w kodzie, użyłem syntetycznego przykładu do przetestowania mojej procedury, ale wynik jest niezadowalający, co ilustrują dwie liczby poniżej (pierwsza dotyczy symulacji obserwacji, a druga rysunek pokazuje histogram sporządzony z szacowanego CDF) :
Czy jest ktoś, kto wie, gdzie jest problem? Z góry dziękuję.
źródło
Odpowiedzi:
Estymator gęstości jądra (KDE) tworzy rozkład będący mieszanką lokalizacji rozkładu jądra, więc aby wyciągnąć wartość z oszacowania gęstości jądra, wystarczy (1) narysować wartość z gęstości jądra, a następnie (2) niezależnie wybierz jeden z punktów danych losowo i dodaj jego wartość do wyniku (1).
Oto wynik tej procedury zastosowanej do zestawu danych takiego jak ten w pytaniu.
Histogram po lewej stronie przedstawia próbkę. Dla porównania, czarna krzywa przedstawia gęstość, z której narysowano próbkę. Czerwona krzywa przedstawia KDE próbki (przy użyciu wąskiej przepustowości). (Nie jest problemem, ani nawet nieoczekiwanym, że czerwone piki są krótsze niż czarne piki: KDE rozkłada różne rzeczy, więc piki będą niższe, aby to zrekompensować).
Histogram po prawej przedstawia próbkę (tego samego rozmiaru) z KDE. Czarne i czerwone krzywe są takie same jak poprzednio.
Oczywiście procedura stosowana do pobierania próbek z prac gęstościowych. Jest również niezwykle szybki:
R
poniższa implementacja generuje miliony wartości na sekundę z dowolnego KDE. Skomentowałem to mocno, aby pomóc w przenoszeniu do Pythona lub innych języków. Sam algorytm próbkowania jest zaimplementowany w funkcjirdens
z liniamirkernel
rysujen
próbki IDID z funkcji jądra, podczas gdysample
rysujen
próbki z zamianą z danychx
. Operator „+” dodaje dwie tablice próbek element po elemencie.jak twierdzono.
źródło
Próbkujesz najpierw z CDF, odwracając go. Odwrotny CDF nazywany jest funkcją kwantylową; jest to mapowanie z [0,1] na domenę RV. Następnie próbkuje się losowe jednolite RV jako percentyle i przekazuje się je do funkcji kwantylu, aby uzyskać losową próbkę z tego rozkładu.
źródło
W tym miejscu chcę również opublikować kod Matlab zgodnie z ideą opisaną przez Whucera, aby pomóc tym, którzy znają Matlaba bardziej niż R.
Oto wynik:
Poinformuj mnie, jeśli ktoś znajdzie jakiś problem z moim zrozumieniem i kodem. Dziękuję Ci.
źródło
Nie przyglądając się zbytnio swojej implementacji, nie otrzymuję w pełni twojej procedury indeksowania, aby czerpać z ICDF. Myślę, że czerpiesz z CDF, a nie odwrotnie. Oto moja implementacja:
źródło