2016-01-17 4 views
1

Je veux produire 10000 nombres avec distribution discrète de Pareto dans matlab.Échantillonnage dans Matlab avec distribution pareto discrète

J'ai écrit ce code dans R, mais je veux l'écrire dans Matlab.

code R pour Pareto discret:

N<-5 ##for instance,you need N large enough 
i0<-(1:N) 
p<-1/(i0^1.98); p<-p/sum(p) 
X<-sample(i0,N,replace=TRUE,prob=p) 
X 

alpha = 1,98 et que vous voyez la distribution pPareto discrète dans ce lien que q = 0, https://en.wikipedia.org/wiki/Zipf%E2%80%93Mandelbrot_law

Ma question est: Comment puis-je écrire ce code à Matlab?

J'utilise randsample dans matlab et traduit ce code dans matlab.

Par exemple:

N=5; 
for i0=1:N 
    p=1/(i0.^1.98); 
    P=p/sum(p);` 
    X=randsample(i0,N,true,P); 
    X 
end 

Mais il a une erreur.

Quelqu'un peut-il faire une suggestion?

+1

Pouvez-vous inclure l'erreur? – steveb

Répondre

0

Voici quelques suggestions:

  1. Votre code a une erreur dans ce: P = p/somme (p); ` doit être P = p/somme (p);

(Cela peut être une chose de formatage qui a juste besoin d'être modifié, mais on ne sait pas ce que votre erreur est: alors commencez ici)

  1. Vous pourriez avoir besoin des statistiques et la machine Boîte à outils d'apprentissage utiliser randsample, qui nécessite une licence supplémentaire. Si ce n'est pas le cas, tapez help randsample sur le terminal MATLAB et vérifiez vos paramètres.

Cela semble être la pièce qui vous intéresse (de l'aide):

Y = randsample (N, K, vrai, W) ou randsample (POPULATION, K, vrai, W) renvoie un échantillon pondéré , en utilisant des poids positifs W, pris avec remplacement. W est souvent un vecteur de probabilités. Cette fonction ne prend pas en charge l'échantillonnage pondéré sans remplacement.

  1. Je pense que vous avez peut-être un malentendu dans votre code. Il semble que vous pensiez que P devrait être une distribution, mais cela signifie que p serait un tableau ou un vecteur. Cependant, à partir de votre code

p=1/(i0.^1.98);

va tout simplement d'évaluer à une valeur scalaire (c.-à-p, pour i0 = 1, Evalue à 1^(- 1,98), et donc P sera juste égale à 1.

Peut-être que vous cherchez quelque chose comme ça?

N=5; 
i0=1:N; 
p=1./(i0.^1.98); 
P=p/sum(p); 
X=randsample(i0,N,true,P) 

(je l'ai laissé la dernière ; de sorte que vous pouvez afficher le résultat à votre terminal)

+0

merci utilisateur2254698. J'ai oublié l'utilisation "." Dans p = 1 ./ (i0.^1.98); et ici, je pense que je ne devrais pas utiliser "pour" !! – samira

+0

@samira - Oui, en général, vous voulez éviter les boucles "for" dans MATLAB où vous le pouvez. Votre code fonctionnera toujours avec les boucles for, mais n'est généralement pas optimisé pour l'exécution de MATLAB. Êtes-vous satisfait de la réponse, j'ai donné? Si oui, pouvez-vous l'accepter? – informaton

+0

Typiquement la boucle qui nécessite "pour" devrait être appliquée dans Matlab mais je ne sais pas pourquoi je suis entré "pour" ça me donne errore et je dois l'enlever – samira