2010-11-01 12 views
5

Nếu chúng ta có một biến ngẫu nhiên rời rạc và dữ liệu liên quan đến nó trong X (n), làm thế nào trong MATLAB chúng ta có thể xác định hàm khối lượng xác suất pmf (X)?Xác định hàm khối xác suất của biến ngẫu nhiên

+0

"pmf" của bộ dữ liệu (toán học) là gì? – rubenvb

+0

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

+0

nên pmf (X) là phân phối tần số chuẩn hóa của X? Nếu có, chúng ta có bất kỳ chức năng nào trong Matlab để tính toán nó không? – SkypeMeSM

Trả lời

5

Bạn có thể thực hiện việc này trong ít nhất tám cách khác nhau (một số trong số chúng đã được đề cập trong các giải pháp khác).

Giả sử chúng ta có một mẫu từ một biến ngẫu nhiên rời rạc:

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

Hãy xem xét các giải pháp này tương đương (lưu ý rằng tôi không thừa nhận bất cứ điều gì về một loạt các giá trị có thể, chỉ là họ là các số nguyên):

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

lưu ý rằng GRP2IDX được sử dụng để lấy chỉ mục bắt đầu từ 1 tương ứng với các mục nhập của pmf (ánh xạ được đưa ra bởi labels).Kết quả của việc trên là:

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

liên quan: http://stackoverflow.com/a/2885175/ 97160 – Amro

1

Đoạn trích sau đây từ MATLAB documentation cho biết cách vẽ biểu đồ. Đối với một hàm xác suất rời rạc, phân bố tần số có thể giống hệt với biểu đồ.

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

Tính tổng của tất cả các phần tử trong mỗi thùng. Chia tất cả các thùng theo tổng để lấy pdf của bạn. Kiểm tra pdf của bạn bằng cách thêm tất cả các yếu tố. Kết quả phải là một.

Hy vọng tôi phù hợp với tuyên bố của tôi. Đó là một thời gian dài kể từ khi ...

0

Nếu tôi hiểu chính xác những gì bạn cần làm là ước tính pdf, ngoại trừ nó không phải là giá trị liên tục nhưng rời rạc.

Tính toán sự xuất hiện của các giá trị khác nhau trong X (n) và chia cho n. Để minh họa những gì tôi đang nói, xin vui lòng cho phép tôi đưa ra một ví dụ. Giả sử rằng bạn có 10 quan sát:

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

sau đó PMF của bạn sẽ trông như thế này:

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

chỉnh sửa: này là về nguyên tắc một biểu đồ tần số, như @zellus cũng đã chỉ ra

1

Làm thế nào về chức năng này?

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

Đây có phải là chính xác theo ý kiến ​​của bạn không?

+0

Không biết chức năng đó. Tôi nghĩ rằng nó làm công việc của bạn. Thường có một số cách để thực hiện một công việc trong MATLAB. – zellus

+1

Một báo trước ... bạn cần Hộp công cụ Thống kê để sử dụng [TABULATE] (http://www.mathworks.com/help/toolbox/stats/tabulate.html). – gnovice

1

Có thể thử làm chỉ là một chức năng xử lý, do đó bạn không cần phải lưu trữ mảng khác:

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

Để thêm thêm một tùy chọn (vì có một số chức năng có sẵn để làm những gì bạn muốn), bạn có thể dễ dàng tính toán PMF sử dụng chức năng ACCUMARRAY nếu các giá trị rời rạc của bạn là số nguyên lớn hơn 0:

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

Dưới đây là một ví dụ:

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

Thay vào đó tôi sẽ sử dụng: 'pmf = accumarray (X (:), 1); pmf = pmf./sum (pmf); '(số ổn định hơn: một bộ phận thay vì thêm nhiều phân số) – Amro

+0

@Amro: Rất đúng. Điều đó sẽ làm giảm tích lũy các lỗi dấu phẩy động tiềm ẩn. Câu trả lời đã được cập nhật. – gnovice

+1

bạn cũng nên lưu ý rằng nếu phạm vi giá trị có thể không bắt đầu tại '1' bạn sẽ nhận được nhiều số không ở đầu. Hãy thử chạy trên với 'X = X + 100;' (một cuộc gọi đến GRP2IDX có thể giải quyết vấn đề này) Tương tự với giải pháp TABULATE bởi @SkypeMeSM .. – Amro