2014-08-28 7 views
0

J'ai un vecteur dans Matlab qui ressemble à:Matlab écart-type - traiter vecteur probabilités, les valeurs non

vect = 0 
    100 
    300 
    500 
    700 
    1000 
    500 
    300 
    200 
     0 

Lorsque normalisée, chaque valeur doit indiquer la probabilité d'une certaine valeur, et mes valeurs sont seulement 1 à 10 (soit 0% de chance de 1, 100/sum(vect) chance de 2, etc.).

Comment puis-je élaborer des statistiques sur la valeur (en particulier l'écart-type) ..? Si je fais mean(vect), je finis avec 360, et j'ai une valeur similaire pour l'écart-type. La valeur moyenne devrait, bien sûr, être d'environ 5. Je suis sûr que ce ne serait pas trop difficile de coder manuellement du tout, mais il doit y avoir une façon de le faire directement dans Matlab, alors j'ai pensé que je demanderais !

Répondre

2

Je ne suis pas vraiment sûr si matlab a une fonction intégrée pour cela, mais ce n'est pas grave. Les deux sont une liners de toute façon

vect = [0; 100; 300; 500; 700; 1000; 500; 300; 200; 0]; 
prob = vect./sum(vect); 
val = [1:10].'; 
meanVal = sum(prob.*val); 
stDev = sqrt(sum(prob.*val.^2) -sum(prob.*val)^2); 

EDIT:

Il y a deux fonctions qui fait cela. Ils sont également appelés mean et std. Mais ils prennent un objet de distribution de probabilité à la place.

+0

ouais - c'est certainement la façon de le faire explicitement, mais il semble étrange qu'il n'y ait pas plus de route directe .. – tiswas

+0

Eh bien, je dirais qu'en général, vous n'avez pas besoin d'une façon plus directe de le faire . Si vous voulez tellement avoir un moyen plus direct, vous devez écrire une fonction qui vous est propre. Stockez-le dans un chemin que vous incluez toujours dans matlab ou placez-le dans un endroit où vous vous souvenez de l'emplacement d'un dossier "tools" et ajoutez-le quand vous en avez besoin. Cependant, regardez 'meanVal = sum (prob. * Val)'. Peut-on vraiment dire que c'est un itinéraire direct? Il serait probablement plus difficile de créer d'abord un objet de distribution de probabilité et d'avoir éventuellement plus de temps système et une durée d'exécution plus longue. – patrik

+0

@tiswas Savez-vous aussi que vous pouvez aussi écrire une fonction de démarrage dans matlab. Dans celui-là, vous pouvez ajouter des routines de démarrage qui ne sont pas déjà effectuées par matlab. Par exemple, vous pouvez définir un chemin dedans. Donc, si vous avez des outils que vous voulez toujours inclure, vous pouvez l'ajouter à votre fonction de démarrage. Donc, en d'autres termes, si vous pensez que matlab manque un oneliner, vous pouvez prendre 5 minutes pour écrire la fonction et la définir dans un chemin qui est ajouté à votre fonction de démarrage. Vous n'aurez jamais plus besoin de vous en soucier et vous n'avez passé que 5 minutes de votre temps. – patrik

1

Si vous appelez stem(vect) vous verrez que vect est la fonction de densité de probabilité d'une variable normalement distribuée, vous pouvez donc adapter une distribution normale à vectsans normalisation

x = (1:length(vect))'; 
pdf = fitdist(x, 'normal', 'freq', vect); 

Le résultat a une moyenne valeur de 5.63889 et un écart type de 1.66944.

Questions connexes