Détermination de la fonction de masse de probabilité de la variable aléatoire
-
28-09-2019 - |
Question
Si nous avons une variable aléatoire discrète x et les données concernant dans X (n), comment peut-on en Matlab déterminer la fonction de probabilité PMF (X)?
La solution
Vous pouvez le faire dans au moins huit façons différentes (certains d'entre eux ont déjà été mentionnés dans les autres solutions).
Disons que nous avons un échantillon d'une variable aléatoire discrète:
X = randi([-9 9], [100 1]);
Tenez compte de ces solutions équivalentes (notez que je ne suppose rien sur la plage de valeurs possibles, juste qu'ils sont des entiers):
[V,~,labels] = grp2idx(X);
mx = max(V);
%# TABULATE (internally uses HIST)
t = tabulate(V);
pmf1 = t(:, 3) ./ 100;
%# HIST (internally uses HISTC)
pmf2 = hist(V, mx)' ./ numel(V); %#'
%# HISTC
pmf3 = histc(V, 1:mx) ./ numel(V);
%# ACCUMARRAY
pmf4 = accumarray(V, 1) ./ numel(V);
%# SORT/FIND/DIFF
pmf5 = diff( find( [diff([0;sort(V)]) ; 1] ) ) ./ numel(V);
%# SORT/UNIQUE/DIFF
[~,idx] = unique( sort(V) );
pmf6 = diff([0;idx]) ./ numel(V);
%# ARRAYFUN
pmf7 = arrayfun(@(x) sum(V==x), 1:mx)' ./ numel(V); %#'
%# BSXFUN
pmf8 = sum( bsxfun(@eq, V, 1:mx) )' ./ numel(V); %#'
Notez que GRP2IDX a été utilisé pour obtenir des indices à partir de 1 correspondant aux entrées de pmf
(la mise en correspondance est donnée par labels
). Le résultat de ce qui précède est:
>> [labels pmf]
ans =
-9 0.03
-8 0.07
-7 0.04
-6 0.07
-5 0.03
-4 0.06
-3 0.05
-2 0.05
-1 0.06
0 0.05
1 0.04
2 0.07
3 0.03
4 0.09
5 0.08
6 0.02
7 0.03
8 0.08
9 0.05
Autres conseils
L'extrait suivant de la documentation de spectacles comment tracer une histogramme. Pour une fonction de probabilité discrète, distribution de fréquence peut être identique à l'histogramme.
x = -4:0.1:4;
y = randn(10000,1);
n = hist(y,x);
pmf = n/sum(n);
plot(pmf,'o');
Calculer la somme de tous les éléments dans chaque bac. Diviser les bacs par la somme pour obtenir votre pdf. Testez votre pdf en additionnant tous les éléments. Le résultat doit être un.
L'espoir que je ne me trompe pas avec mes déclarations. Il est longtemps que ...
Que diriez-vous cette fonction?
function Y = pmf(X)
A=tabulate(X)
A(:,3)=A(:,3)/100
Y=A(:,3)'
Est-ce correct à votre avis?
Peut-être essayez de faire juste une poignée de fonction de sorte que vous n'avez pas besoin de stocker un autre tableau:
pmf = @(x) arrayfun(@(y) nnz(DATA==y)/length(DATA),x);
Pour ajouter encore une autre option (car il y a un certain nombre de fonctions disponibles pour faire ce que vous voulez), vous pouvez facilement calculer la PMF en utilisant la fonction accumArray si vos valeurs discrètes sont des nombres entiers supérieurs à 0:
pmf = accumarray(X(:),1)./numel(X);
Voici un exemple:
>> X = [1 1 1 1 2 2 2 3 3 4]; %# A sample distribution of values
>> pmf = accumarray(X(:),1)./numel(X) %# Compute the probability mass function
pmf =
0.4000 %# 1 occurs 40% of the time
0.3000 %# 2 occurs 30% of the time
0.2000 %# 3 occurs 20% of the time
0.1000 %# 4 occurs 10% of the time
Si je comprends bien ce que vous devez faire est d'estimer le pdf, sauf que ce ne sont pas des valeurs continues mais discrètes.
Calculer les occurrences de valeurs différentes dans X (n) et diviser par n. Pour illustrer ce que je veux dire, s'il vous plaît permettez-moi de donner un exemple. Supposons que vous avez 10 observations:
X = [1 1 2 3 1 9 12 3 1 2]
alors votre PMF ressemblerait à ceci:
pmf(X) = [0.4 0.2 0.2 0 0 0 0 0 0.1 0 0 0.1]
modifier c'est en principe un histogramme de fréquence, comme @zellus a également souligné