Определение вероятности массовой функции случайной величины - PullRequest
5 голосов
/ 01 ноября 2010

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

Ответы [ 6 ]

5 голосов
/ 04 ноября 2010

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

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

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
1 голос
/ 01 ноября 2010

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

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

pmf = @(x) arrayfun(@(y) nnz(DATA==y)/length(DATA),x);
1 голос
/ 01 ноября 2010

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

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

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

1 голос
/ 01 ноября 2010

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

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

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

Надеюсь, я прав с моими заявлениями.Давно не было ...

0 голосов
/ 01 ноября 2010

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

edit: это в принципе гистограмма частоты@zellus также указал

...