4 votos

La parte radial de una distribución normal.

Estoy leyendo un papel que me pide que me de la muestra $s_i$ a partir de una distribución como esta:

$s_i \sim (2\pi)^{-\frac{d}{2}}A^{-1}_{d-1}r^{d-1}e^{-\frac{r^2}{2}}$

"Aquí la constante de normalización $A_{d−1}$ denota la superficie de volumen de la d-dimensional de la unidad de pelota. Por lo tanto $s_i$ partidos de la parte radial de la distribución normal"

¿Cuál es la parte radial de la distribución normal?

La distribución anterior es la relativa a la inversa de la hiper-superficie de la unidad de la pelota, pero el radio de la parte no invertida. Puedo sólo la muestra de una distribución normal y la escala? Estoy tratando de obtener una muestra de esta distribución en C++.

Gracias de antemano por cualquier ayuda en la comprensión de la distribución anterior.

4voto

yjfuk Puntos 278

Yo gauss está trabajando en la comida rápida método. Como se señaló en el papel de la distribución de los partidos de la parte radial de la distribución normal. Para $d = 2$ es igual a la distribución de Rayleigh así que usted puede utilizar las implementaciones estándar de la muestra $s_i$. Para mayor sea el valor de d puede tomar muestras de una $d$ dimensional cero significa que la distribución gaussiana y, a continuación, calcular la longitud del vector aleatorio. Este método funciona bien en términos de corrección. Sin embargo, la generación de n muestras de la utilización de este método de las necesidades de $nd$ tiempo que es mucho mayor que el tiempo global de la complejidad de la comida rápida del algoritmo. Por lo tanto, está bien sólo para probar la exactitud del algoritmo.

Actualización: recientemente me di cuenta de que $s_i$ tiene distribución chi. Equivalentemente, se puede degustar de chi-cuadrado de distribución y calcular la raíz cuadrada de las muestras. Yo succsesfully probado en el Matlab y después de que usted puede encontrar el código fuente:

function [ ws ] = FF_samples( ndim, nsamples, sigm)
    ws = [];
    d = 2 ^ ceil(log2(ndim));
    x = ceil(nsamples/d);
    for bi = 1:x
        I = eye(d);

        B = diag(2*randi(2, d, 1) - 3);
        H = hadamard(d);
        P = I(randperm(d), :);
        G = diag(normrnd(0,1, d, 1));
        S = diag( chi2rnd(d,d,1) .^ .5) * sum(diag(G) .^ 2).^-.5;
        %%
        nws = (1/sigm / d)^.5 * S * H * G * P * H * B;
        ws = [ws; nws];
    end
    ws = ws(1:nsamples, 1:ndim);
end

P. S.: todavía necesita algunas mejoras, puesto que yo no uso de la transformada rápida de Fourier como algoritmo para la multiplicación de la Hamard de la matriz a un vector.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X