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)?

Était-ce utile?

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

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é

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