Domanda

Se abbiamo una variabile discreta x caso e i dati relativi ad essa in X (n), come in MATLAB possiamo determinare la funzione di massa di probabilità PMF (X)?

È stato utile?

Soluzione

È possibile farlo in almeno otto modi diversi (alcuni di loro sono stati già menzionati nelle altre soluzioni).

dire che abbiamo un campione da una variabile casuale discreta:

X = randi([-9 9], [100 1]);

Considerate queste soluzioni equivalenti (si noti che non mi assumo nulla circa la gamma dei possibili valori, solo che sono numeri interi):

[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);      %#'

nota che GRP2IDX stato usato per ottenere indici partendo da 1 corrispondenti alle voci della pmf (mappatura è dato da labels). Il risultato di quanto sopra è:

>> [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

Altri suggerimenti

Il seguente estratto da spettacoli MATLAB documentazione come tracciare un istogramma. Per una funzione di probabilità discreta, la distribuzione di frequenza potrebbe essere identica con l'istogramma.

x = -4:0.1:4;
y = randn(10000,1);
n = hist(y,x);
pmf = n/sum(n);
plot(pmf,'o');

Calcola la somma di tutti gli elementi in ogni bin. Dividere tutti i contenitori per la somma per ottenere il vostro pdf. Prova il tuo pdf sommando tutti gli elementi. Il risultato deve essere uno.

La speranza che ho ragione con le mie affermazioni. E 'da molto tempo che ...

Che ne dite di questa funzione?

function Y = pmf(X)
A=tabulate(X)
A(:,3)=A(:,3)/100
Y=A(:,3)'

È corretto secondo te?

Forse provare a fare solo una maniglia funzione in modo non è necessario per memorizzare un altro array:

pmf = @(x) arrayfun(@(y) nnz(DATA==y)/length(DATA),x);

Per aggiungere ancora un'altra opzione (dato che ci sono un certo numero di funzioni disponibili a fare ciò che si vuole), si potrebbe facilmente calcolare la PMF utilizzando la funzione di ACCUMARRAY se i valori discreti sono interi maggiori di 0:

pmf = accumarray(X(:),1)./numel(X);

Ecco un esempio:

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

Se ho capito bene quello che devi fare è quello di stimare il pdf, tranne che non è valori continui, ma discreti.

Calcolare le occorrenze di valori differenti in X (n) e dividere per n. Per illustrare quello che sto dicendo, mi permetta di fare un esempio. Supponiamo di avere 10 osservazioni:

X = [1 1 2 3 1 9 12 3 1 2]

allora il vostro PMF sarebbe simile a questa:

pmf(X) = [0.4 0.2 0.2 0 0 0 0 0 0.1 0 0 0.1]

modifica questo è in linea di principio un istogramma delle frequenze, come @zellus sottolineato anche

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top