Определение вероятности массовой функции случайной величины

Если у нас есть дискретная случайная величина x и данные, относящиеся к ней в X(n), как в matlab мы можем определить функцию массы вероятности pmf(X)?

6 ответов

Решение

Вы можете сделать это как минимум восемью различными способами (некоторые из них уже упоминались в других решениях).

Скажем, у нас есть выборка из дискретной случайной величины:

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

Может быть, попробуйте сделать просто дескриптор функции, чтобы вам не нужно было хранить другой массив:

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

Следующая выдержка из документации MATLAB показывает, как построить гистограмму. Для дискретной функции вероятности распределение частот может совпадать с гистограммой.

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

Рассчитать сумму всех элементов в каждом бине. Разделите все корзины на сумму, чтобы получить PDF. Проверьте свой PDF, сложив все элементы. Результат должен быть один.

Надеюсь, я прав с моими заявлениями. Это давно, так как...

Чтобы добавить еще одну опцию (поскольку есть ряд функций, доступных для того, что вы хотите), вы можете легко вычислить pmf, используя функцию ACCUMARRAY, если ваши дискретные значения - целые числа больше 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

Как насчет этой функции?

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

Это правильно по вашему мнению?

Если я правильно понял, что вам нужно сделать, это оценить 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 также указал

Другие вопросы по тегам