Matlab - вычисление вероятности каждого элемента в векторе - PullRequest
4 голосов
/ 04 августа 2011

У меня есть вектор y, который может иметь следующую форму:

y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5]

И я хочу прикрепить вероятность к каждому элементу в пределах y, как это было быбыл сгенерирован случайной величиной.В этом случае элемент 1 будет иметь вероятность 6/14, элемент 2 будет иметь вероятность 4/14, элемент 3 - значение 2/14, а элементы 4 и 5 - значение 1 / 14.

И в основном результат должен выглядеть следующим образом:

prob_y = 1/14 * [6 6 6 6 4 4 4 4 6 6 2 2 1 1]

Есть ли способ сделать это без каких-либо циклов for или while?

Ответы [ 3 ]

5 голосов
/ 04 августа 2011

Уникальные элементы в вашем входном векторе можно определить с помощью функции UNIQUE . Затем вы можете получить желаемый результат, используя ARRAYFUN и анонимную функцию , которая проверяет количество каждого уникального элемента в вашем входном векторе:

>> y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5];
>> prob_y = arrayfun(@(x)length(find(y==x)), unique(y)) / length(y)

prob_y =

    0.4286    0.2857    0.1429    0.0714    0.0714
2 голосов
/ 04 августа 2011

Вот пример использования ACCUMARRAY :

y = [1.3 1 1 1 2 2 2 2 1 1 3 3 4 5];

[g,~,gl] = grp2idx(y);
count = accumarray(g,1);
p = count(g) ./ numel(g)

Вероятности:

>> [y(:) p]
ans =
          1.3     0.071429
            1      0.35714
            1      0.35714
            1      0.35714
            2      0.28571
            2      0.28571
            2      0.28571
            2      0.28571
            1      0.35714
            1      0.35714
            3      0.14286
            3      0.14286
            4     0.071429
            5     0.071429

Вы можете просмотреть сводку по событиям в виде:

>> [gl count]
ans =
            1            5
          1.3            1
            2            4
            3            2
            4            1
            5            1

Обратите внимание, что я использую GRP2IDX для обработки таких случаев, как 1.3 или целых чисел, не начинающихся с 1.

2 голосов
/ 04 августа 2011

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

Примерно так:

y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5]
p = hist(y, max(y) - min(y) + 1) / length(y)

[Изменить] Чтобы ответить на ваш обновленный вопрос: используйте y, чтобы выбрать индексы из p, например:

prob_y = p(y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...