fonction de densité de probabilité à partir d'un papier, mis en oeuvre en utilisant C ++, ne fonctionne pas comme prévu

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

Question

Je suis donc mettre en œuvre un algorithme heuristique, et je suis venu dans cette fonction.

I ai un tableau de 1 à n (0 à n-1 sur C, w / e). Je veux choisir un certain nombre d'éléments que je vais copier à un autre tableau. Compte tenu d'un paramètre y, (0

Selon l'auteur, "l" est un nombre aléatoire: 0

i codé de la première partie de la fonction, pour y <= 0,5   J'ensemble Y de 0,2, et n et 100. Cela signifie qu'il a dû retourner un nombre compris entre 0 et 99, avec 20 la moyenne.   Et les résultats ne sont pas entre 0 et n, mais certains flotteurs. Et plus n est plus petit ce flotteur est.

Ceci est le code de test C. "X" est le paramètre "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);  
}  

Et voici quelques résultats (5 décimales tronquées):

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 

L'article est:

http://www.scribd.com/doc/ 3097936 / čAS-La-Cunning-Ant-système

pages 6 et 7.

ou la recherche ": système fourmi ČAS la ruse" sur google.

Alors qu'est-ce que je fais mal? Je ne crois pas que l'auteur est faux, parce qu'il ya plus de 5 documents décrivant cette même fonction.

tous mes internets à celui qui me aide. Il est important de mon travail.

Merci:)

Était-ce utile?

La solution

dmckee est correcte, mais je pensais que j'élaborerait plus et essayer d'expliquer une partie de la confusion. Je pourrais certainement échouer. f_s(l), la fonction que vous avez dans votre formule ci-dessus assez, est la fonction de distribution de probabilité. Il vous dit, pour une l d'entrée donné entre 0 et n, la probabilité que l est la longueur du segment. La somme (intégrale) pour toutes les valeurs comprises entre 0 et n doit être égal à 1.

Le graphique en haut de la page 7 embrouille ce point. Il trace l contre f_s(l), mais vous devez faire attention pour les facteurs parasites qu'il met sur le côté. Vous remarquez que les valeurs du fond aller de 0 à 1, mais il est un facteur de x n sur le côté, ce qui signifie que les valeurs de l vont en fait de 0 à n. En outre, sur l'axe y il y a un x 1/n qui signifie que ces valeurs ne vont pas réellement jusqu'à environ 3, ils vont à 3 / n.

Alors, que faites-vous maintenant? Eh bien, vous devez résoudre pour la fonction de distribution cumulative en intégrant la fonction de distribution de probabilité sur l qui se fait avéré être pas trop mal (je l'ai fait avec le Mathematica Wolfram intégrateur en ligne en utilisant x pour l et en utilisant uniquement l'équation pour y <= 0,5). Cela a toutefois été en utilisant une intégrale indéfinie et vous êtes vraiment l'intégration le long x de 0 à l. Si l'on fait l'équation résultante égale à une variable (z par exemple), l'objectif est maintenant de résoudre pour l en fonction de z. z est ici un nombre aléatoire entre 0 et 1. Vous pouvez essayer d'utiliser un solveur symbolique pour cette partie si vous voulez (je). Ensuite, vous avez non seulement atteint votre objectif d'être en mesure de choisir au hasard ls de cette distribution, vous avez également atteint le nirvana.

Un peu plus de travail fait

Je vais aider un peu plus. Je fais ce que j'ai essayé dit au sujet de y <= 0,5, mais le système d'algèbre symbolique que j'utilisais ne pouvais pas faire l'inversion (un autre système pourrait être en mesure de). Cependant, alors j'ai décidé d'essayer d'utiliser l'équation de 0,5 l à x dans f_s(l) I get

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

L'intégration de cette plus x de 0 à l je suis arrivé (à l'aide en ligne intégrateur de Mathematica):

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

Il ne va pas beaucoup plus agréable que ce genre de chose. Si je mets cet égal à z et résous pour l je reçois:

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

Une vérification rapide est pour y = 1. Dans ce cas, nous obtenons l = n, peu importe ce que z est. Jusqu'ici tout va bien. Maintenant, vous générez juste z (un nombre aléatoire entre 0 et 1) et vous obtenez un l qui est distribué comme vous souhaité pour 0,5 l -> n-l et y -> 1-y et get

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

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

De toute façon, qui devrait résoudre votre problème à moins que je fait un peu quelque part d'erreur. Bonne chance.

Autres conseils

Vous pouvez mal comprendre ce qu'on attend de vous.

Etant donné un (correctement normalisé) PDF et vouloir lancer une distribution aléatoire cohérente avec elle, vous formez la distribution de probabilité cumulative (CDF) en intégrant le PDF, puis inverser la CDF, et utilisez un prédicat aléatoire uniforme comme argument de la fonction inverse.


Un peu plus en détail.

f_s(l) est le PDF, et a été normalisé sur [0,n).

Maintenant, vous intégrez pour former le CDF

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

Notez que ceci est une intégrale définie à un point final non spécifié que j'ai appelé l'. Le CDF est donc fonction de l'. En supposant que nous avons la normalisation droite, g_s(N) = 1.0. Si ce n'est pas si l'on applique un coefficient simple à corriger.

Ensuite inverser la CDF et appelez le résultat G^{-1}(x). Pour cela, vous aurez probablement envie de choisir une valeur particulière de gamma.

Ensuite, jeter nombre aléatoire uniforme sur [0,n), et les utiliser comme argument, x, à G^{-1}. Le résultat doit être compris entre [0,1), et doit être distribué selon la f_s.

Comme Justin dit, vous pouvez utiliser un système d'algèbre informatique pour le calcul.

Étant donné que, pour toutes les valeurs l, y, n comme décrit, les termes que vous appelez p1 et p2 sont tous deux dans [0,1) et exp est dans [1, ..) faisant pow (p2, exp) aussi [0,1) donc je ne vois pas comment vous jamais obtenir une sortie avec la gamme [0, n)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top