Metoda jest bardzo prosta, więc opiszę ją prostymi słowami. Najpierw weźmy funkcję rozkładu skumulowanego jakiejś dystrybucji, z której chcemy próbkować. Funkcja przyjmuje jako dane wejściowe pewną wartość i mówi, jakie jest prawdopodobieństwo uzyskania . Więc x X ≤ xFXxX≤x
FX(x)=Pr(X≤x)=p
odwrotność takiej funkcji funkcyjnej, przyjmowałby jako wejście i zwrócił . Zauważmy, że „s są rozłożone równomiernie - to może być wykorzystywane do pobierania próbek z każdego jeśli wiesz . Metoda nazywana jest próbkowaniem z transformacją odwrotną . Pomysł jest bardzo prosty: łatwo jest równomiernie próbkować wartości z , więc jeśli chcesz próbkować z jakiegoś , po prostu weź wartości i przekaż przez w celu otrzymania „s p x p F X F - 1 X U ( 0 , 1 ) F X u ∼ U ( 0 , 1 ) u F - 1 X xF−1XpxpFXF−1XU(0,1)FXu∼U(0,1)uF−1Xx
F−1X(u)=x
lub w R (dla rozkładu normalnego)
U <- runif(1e6)
X <- qnorm(U)
Aby to zobrazować, spójrz na CDF poniżej, ogólnie myślimy o rozkładach w kategoriach spojrzenia na oś dla prawdopodobieństwa wartości z osi . W przypadku tej metody próbkowania robimy coś przeciwnego i zaczynamy od „prawdopodobieństw” i używamy ich do wybierania powiązanych z nimi wartości. Przy rozkładach dyskretnych traktujesz jako linię od do i przypisujesz wartości na podstawie tego, gdzie w tym wierszu leży punkt (np. jeśli lub jeśli do próbkowania z ).x U 0 1 u 0 0 ≤ u < 0,5 1 0,5 ≤ u ≤ 1 B e r n o u l l i ( 0,5 )yxU01u00≤u<0.510.5≤u≤1Bernoulli(0.5)
Niestety, nie zawsze jest to możliwe, ponieważ nie każda funkcja ma swoją odwrotność, np. Nie można użyć tej metody z rozkładami dwuwymiarowymi. Nie musi to być również najbardziej wydajna metoda we wszystkich sytuacjach, w wielu przypadkach istnieją lepsze algorytmy.
Pytasz także, jaki jest rozkład . Ponieważ jest odwrotnością , to i , więc tak, wartości uzyskane za pomocą takie metody mają ten sam rozkład, jak . Możesz to sprawdzić za pomocą prostej symulacjiF - 1 X F X F X ( F - 1 X ( u ) ) = u F - 1 X ( F X ( x ) ) = x Xfa- 1X( u )fa- 1XfaXfaX( F.- 1X( u ) ) = ufa- 1X( F.X( x ) ) = xX
U <- runif(1e6)
all.equal(pnorm(qnorm(U)), U)