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
Trả lời
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
liên quan: http://stackoverflow.com/a/2885175/ 97160 – Amro
Đ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 ...
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
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?
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);
Để 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
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
@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
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
"pmf" của bộ dữ liệu (toán học) là gì? – rubenvb
http://en.wikipedia.org/wiki/Probability_mass_function – zellus
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