función de densidad de probabilidad a partir de un papel, implementado usando C ++, no funciona como se pretende

StackOverflow https://stackoverflow.com/questions/4103477

Pregunta

Así que estoy poniendo en práctica un algoritmo heurístico, y me he encontrado con esta función.

I tienen una serie de 1 a n (0 a n-1 en C, w / e). Quiero elegir una serie de elementos voy a copiar a otra matriz. Teniendo en cuenta un parámetro y, (0

Según el autor, "l" es un número aleatorio: 0

Así codifiqué la primera parte de la función, para y <= 0,5   I conjunto Y a 0,2, y n a 100. Esto significa que tenían que devolver un número entre 0 y 99, con un promedio de 20.   Y los resultados no son entre 0 y n, pero algunos flotadores. Y cuanto mayor es n, más pequeño es este flotador.

Este es el código de prueba C. "X" es el parámetro de "l".

//hate how code tag works, it's not even working now  
int n = 100;  
float y = 0.2;  
float n_copy;  

for(int i = 0 ; i < 20 ; i++)  
{  
    float x = (float) (rand()/(float)RAND_MAX);  // 0 <= x <= 1  
    x = x * n;                                // 0 <= x <= n  
    float p1 = (1 - y) / (n*y);  
    float p2 = (1 - ( x / n ));  
    float exp = (1 - (2*y)) / y;  
    p2 = pow(p2, exp);  
    n_copy = p1 * p2;  
    printf("%.5f\n", n_copy);  
}  

Y aquí están algunos resultados (5 decimales truncados):

0.03354  
0.00484  
0.00003  
0.00029  
0.00020  
0.00028  
0.00263  
0.01619  
0.00032  
0.00000  
0.03598  
0.03975    
0.00704  
0.00176  
0.00001  
0.01333  
0.03396   
0.02795  
0.00005  
0.00860 

El artículo es:

http://www.scribd.com/doc/ 3097936 / CAS-The-Cunning-Ant-System

páginas 6 y 7.

o buscar "CAS: astuto sistema de hormiga" en Google.

Entonces, ¿qué estoy haciendo mal? no creo que el autor está mal, porque hay más de 5 documentos que describen esta misma función.

todos mis internets a cualquiera que me ayude. Esto es importante para mi trabajo.

Gracias:)

¿Fue útil?

Solución

dmckee es realmente correcto, pero pensé que iba a elaborar más y tratar de explicar algo de la confusión aquí. sin duda que pudiera fallar. f_s(l), la función que tiene en su fórmula bastante más arriba, es la función de distribución de probabilidad. Se da a conocer, por un l de entrada dado entre 0 y n, la probabilidad de que l es la longitud del segmento. La suma (integral) para todos los valores entre 0 y n debe ser igual a 1.

El gráfico en la parte superior de la página 7 confunde este punto. Traza l vs f_s(l), pero hay que tener cuidado con los factores callejeros se pone en el lado. Se nota que los valores sobre la marcha inferior de 0 a 1, pero hay un factor de x n en el lado, lo que significa que los valores l realidad van de 0 a n. También, en el eje Y hay una x 1/n que significa que estos valores en realidad no van hasta aproximadamente 3, van a 3 / n.

Entonces, ¿qué hacer ahora? Así, es necesario resolver para la función de distribución acumulada mediante la integración de la función de distribución de probabilidad sobre l que en realidad resulta ser no demasiado malo (lo hice con el Wolfram Mathematica Online integrador mediante el uso de x para l y utilizando sólo la ecuación para y <= 0,5). sin embargo, que estaba usando una integral indefinida y que son realmente la integración a lo largo de x de 0 a l. Si fijamos la ecuación resultante igual a alguna variable (z por ejemplo), el objetivo ahora es resolver para l como una función de z. z aquí es un número aleatorio entre 0 y 1. Usted puede intentar usar un programa de solución simbólica para esta parte si le gustaría (que lo haría). Entonces no sólo han logrado su objetivo de ser capaz de recoger ls aleatorios a partir de esta distribución, que también han alcanzado el nirvana.

Un poco más trabajo

Me va a ayudar un poco más. He intentado hacer lo que dije acerca de y <= 0,5, pero el sistema de álgebra simbólica que estaba usando no era capaz de hacer la inversión (algún otro sistema podría ser capaz). Sin embargo, entonces decidí probar usando la ecuación para 0,5 l ax en f_s(l) I get

y / n / (1 - y) * (x / n)^((2 * y - 1) / (1 - y))

La integración de este sobre x de 0 a l llegué (utilizando Mathematica Integrador de línea):

(l / n)^(y / (1 - y))

No se puede pedir mucho más agradable que con este tipo de cosas. Si lo configuran igual a z y resuelve para l me sale:

l = n * z^(1 / y - 1)      for .5 < y <= 1

Una revisión rápida es para y = 1. En este caso, obtenemos l = n no importa lo que z es. Hasta aquí todo bien. Ahora, sólo genera z (un número aleatorio entre 0 y 1) y se obtiene una l que se distribuye como se desee para 0,5 l -> n-l y y -> 1-y y get

n - l = n * z^(1 / (1 - y) - 1)

l = n * (1 - z^(1 / (1 - y) - 1))      for 0 < y <= .5

De todos modos, que debería resolver su problema a menos que hiciera algo de algún lugar de error. Buena suerte.

Otros consejos

Se puede malinterpretar lo que se espera de usted.

Dado un (debidamente normalizado) PDF y querer tirar una distribución aleatoria coherente con ella, usted forma la distribución de probabilidad acumulativa (CDF) integrando el PDF, luego invierta la CDF, y el uso de un predicado aleatorio uniforme como argumento de la función invertida.


Un poco más de detalle.

f_s(l) es el PDF, y se ha normalizado en [0,n).

Ahora integrarlo para formar la CDF

g_s(l') = \int_0^{l'} dl f_s(l)

Tenga en cuenta que esta es una integral definida a un punto final especificado que he llamado l'. El CDF es en consecuencia una función de l'. Suponiendo que tenemos la normalización derecha, g_s(N) = 1.0. Si esto no es así aplicamos un coeficiente sencilla de solucionarlo.

A continuación invertido la CDF y llamar a la G^{-1}(x) resultado. Para ello, es probable que desee elegir un determinado valor de gamma.

A continuación, tirar de números aleatorios uniforme sobre [0,n), y utilizar aquellos como el argumento, x, a G^{-1}. El resultado debe estar entre [0,1), y debe ser distribuido de acuerdo con f_s.

Al igual que Justin dijo, se puede utilizar un sistema de álgebra computacional para la matemáticas.

Dado que para cualquier valores L, Y, n, como se describe, los términos que llaman p1 y p2 son ambos en [0,1) y exp es en [1, ..) haciendo pow (p2, exp) también en [0,1) por lo tanto no veo cómo le gustaría alguna vez una salida con el rango [0, n)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top