2010-11-01 8 views
5

Se abbiamo una variabile casuale discreta xe i dati ad essa relativi in ​​X (n), come in matlab possiamo determinare la funzione di massa di probabilità pmf (X)?Determinazione della funzione di massa di probabilità della variabile casuale

+0

Che cos'è il "pmf" dell'insieme di dati (matematicamente)? – rubenvb

+0

http://en.wikipedia.org/wiki/Probability_mass_function – zellus

+0

dovrebbe pmf (X) essere la distribuzione di frequenza normalizzata di X? Se sì, abbiamo qualche funzione in Matlab per calcolarla? – SkypeMeSM

risposta

5

È possibile eseguire questa operazione in almeno otto modi diversi (alcuni dei quali sono già stati citati nelle altre soluzioni).

Dire che abbiamo un campione da una variabile casuale discreta:

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

Considerare questi soluzioni equivalenti (notare che io 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 
+0

correlati: http://stackoverflow.com/a/2885175/ 97160 – Amro

1

Il seguente estratto dal MATLAB documentation mostra come stampare un istogramma. Per una funzione di probabilità discreta, la distribuzione di frequenza potrebbe essere identica all'istogramma.

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

Calcolare la somma di tutti gli elementi in ogni contenitore. Dividi tutti i raccoglitori dalla somma per ottenere il tuo pdf. Metti alla prova il tuo pdf sommando tutti gli elementi. Il risultato deve essere uno.

Spero di avere ragione con le mie affermazioni. È da tanto che ...

0

Se ho capito bene, è necessario stimare il pdf, tranne che non è un valore continuo ma discreto.

Calcolare le occorrenze di valori diversi in X (n) e dividere per n. Per illustrare quello che sto dicendo, per favore permettimi di dare 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] 

edit: questo è in linea di principio un istogramma di frequenza, come @zellus ha anche sottolineato

1

Come su questa funzione?

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

È corretto secondo lei?

+0

Non conoscevo questa funzione. Penso che faccia il tuo lavoro. Ci sono spesso diversi modi per fare un lavoro in MATLAB. – zellus

+1

Un avvertimento ... è necessario il Toolbox Statistics per utilizzare [TABULATE] (http://www.mathworks.com/help/toolbox/stats/tabulate.html). – gnovice

1

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); 
1

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 il PMF utilizzando la funzione di ACCUMARRAY se i vostri 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 
+1

Vorrei invece usare: 'pmf = accumarray (X (:), 1); pmf = pmf./sum (pmf); '(numericamente più stabile: una divisione invece di aggiungere più frazioni) – Amro

+0

@Amro: molto vero. Ciò ridurrebbe l'accumulo di potenziali errori in virgola mobile. La risposta è stata aggiornata. – gnovice

+1

si dovrebbe anche notare che se l'intervallo di valori possibili non inizia con '1', si otterranno molti zeri in più all'inizio. Prova a eseguire quanto sopra con 'X = X + 100;' (una chiamata a GRP2IDX può risolvere questo problema) Lo stesso vale per la soluzione TABULATE di @SkypeMeSM .. – Amro