Определение вероятности массы функции случайной переменной
-
28-09-2019 - |
Вопрос
Если у нас есть дискретная случайная величина X и данные, относящиеся к нему в X (N), как в Matlab мы можем определить функцию массы вероятности PMF (X)?
Решение
Вы можете сделать это как минимум по крайней мере восемь разных способов (некоторые из них уже упоминались в других решениях).
Скажем, у нас есть образец из дискретной случайной переменной:
X = randi([-9 9], [100 1]);
Рассмотрим эти эквивалентные решения (обратите внимание, что я ничего не принимаю о диапазоне возможных значений, только что они целые числа):
[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); %#'
Обратите внимание, что GRP2IDX использовался для получения индексов, начиная с 1, соответствующий записям pmf
(сопоставление дается labels
). Результат вышеизложенного является:
>> [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
Другие советы
Следующий выдержка из MatLab документация показывает, как построить гистограмму. Для дискретной функции вероятностей Распределение частоты может быть идентичен гистограмме.
x = -4:0.1:4;
y = randn(10000,1);
n = hist(y,x);
pmf = n/sum(n);
plot(pmf,'o');
Рассчитайте сумму всех элементов в каждой корзине. Разделите все банки на сумму, чтобы получить свой PDF. Проверьте свой PDF, добавив все элементы. Результатом должен быть один.
Надеюсь, я прав с моими заявлениями. Это долгое время с ...
Как насчет этой функции?
function Y = pmf(X)
A=tabulate(X)
A(:,3)=A(:,3)/100
Y=A(:,3)'
Это правильно по вашему мнению?
Может быть, попробуйте сделать только функциональную ручку, чтобы вам не нужно хранить другой массив:
pmf = @(x) arrayfun(@(y) nnz(DATA==y)/length(DATA),x);
Чтобы добавить еще один вариант (так как есть ряд функций, доступных для того, чтобы делать то, что вы хотите), вы можете легко вычислить PMF с помощью функции Аккумулятор Если ваши дискретные значения являются целыми числами более 0:
pmf = accumarray(X(:),1)./numel(X);
Вот пример:
>> 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
Если я правильно понял то, что вам нужно сделать, это оценить PDF, за исключением того, что он не является непрерывным, а дискретные значения.
Рассчитайте вхождения различных значений в x (n) и разделите на n. Чтобы проиллюстрировать то, что я говорю, пожалуйста, позвольте мне привести пример. Предположим, что у вас есть 10 наблюдений:
X = [1 1 2 3 1 9 12 3 1 2]
Тогда ваш PMF выглядел так:
pmf(X) = [0.4 0.2 0.2 0 0 0 0 0 0.1 0 0 0.1]
редактировать: Это в принципе частота гистограммы, так как @zellus также указал