В настоящее время я пытаюсь закодировать функцию, чтобы назначить вероятности для набора векторов, используя количество гистограмм. По сути, это упражнение по подсчету, но для того, чтобы эффективно его достичь, требуется некоторая утонченность. Я проиллюстрирую на примере:
Скажите, что у меня есть матрица X = [x1, x2....xM]
с N
строками и M
столбцами. Здесь X
представляет коллекцию M
, N
-мерных векторов. Другими словами, каждый из столбцов X
является N
-мерным вектором.
В качестве примера, мы можем сгенерировать такие X
для M = 10000
векторов и N = 5
измерений, используя:
X = randint(5,10000)
В результате будет получена матрица 5 x 10000, состоящая из 0 и 1, где каждый столбец представляет 5-мерный вектор из 1 и 0.
Я хотел бы назначить вероятность каждому из этих векторов с помощью основного числа гистограмм. Шаги просты: сначала найдите уникальные столбцы X
; во-вторых, подсчитайте, сколько раз встречается каждый уникальный столбец. Вероятность того или иного события равна # разу того, что этот столбец был в X / общее количество столбцов в X
.
Возвращаясь к примеру выше, я могу сделать первый шаг, используя функцию unique
в MATLAB следующим образом:
UniqueXs = unique(X','rows')'
Приведенный выше код вернет UniqueXs
, матрицу с N
строками, которая содержит только уникальные столбцы X. Обратите внимание, что транспонирование происходит из-за странных входных требований MATLAB.
Однако я не могу найти хороший способ подсчитать, сколько раз каждый столбец в UniqueX находится в X. Поэтому мне интересно, есть ли у кого-нибудь какие-либо предложения?
В общем, я могу думать о двух способах достижения шага счета. Первый способ - использовать функцию find
, хотя я думаю, что это может быть медленно, поскольку find
является поэлементной операцией. Второй способ - это рекурсивный вызов unique
, поскольку он также может предоставить индекс один уникальных столбцов в X
. Это должно позволить нам удалить этот столбец из X
и повторить unique
в полученном X
и продолжать считать.
В идеале, я думаю, что unique
, возможно, уже делает какой-то подсчет, поэтому наиболее эффективным способом, вероятно, будет работа без встроенных функций.