Пример конкретных строк в Matlab - PullRequest
1 голос
/ 28 июня 2011

У меня есть сценарий, в котором есть матрица меток измерения N x 1. Пример записи в матрице меток приведен ниже

Label = [1; 3; 5; ....... 6]

Я хотел бы случайная выборка записей "m1" для label1, записи "m2" для label2 и т. Д., Чтобы выходные данные LabelIndicatorMatrix (измерение N x 1) выглядели примерно как

LabelIndicatorMatrix = [1; 1; 0;.....1]

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

Sum(LabelIndicatorMatrix) = m1+m2...m6

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Одно из возможных решений:

Label = randi([1 6], [100 1]);  %# random Nx1 vector of labels
m = [2 3 1 0 1 2];              %# number of records to sample from each category

LabelIndicatorMatrix = false(size(Label));   %# marks selected records
uniqL = unique(Label);                       %# unique labels: 1,2,3,4,5,6
for i=1:numel(uniqL)
    idx = find(Label == uniqL(i));           %# indices where label==k
    ord = randperm(length(idx));             %# random permutation
    ord = ord(1:min(m(i),end));              %# pick first m_k
    LabelIndicatorMatrix( idx(ord) ) = true; %# mark them as selected
end

Чтобы убедиться, что мы удовлетворяем требованиям, мы проверяем:

>> sum(LabelIndicatorMatrix) == sum(m)
ans =
     1

Вот моя попытка векторизованного решения:

Label = randi([1 6], [100 1]);  %# random Nx1 vector of labels
m = [2 3 1 0 1 2];              %# number of records to sample from each category

%# some helper functions
firstN = @(V,n) V(1:min(n,end));                  %# first n elements from vector
pickN = @(V,n) firstN(V(randperm(length(V))), n); %# pick n elements from vector

%# randomly sample labels, and get indices
idx = bsxfun(@eq, Label, unique(Label)');   %'# idx(:,k) indicates where label==k
[r c] = find(idx);                          %# row/column indices
idx = arrayfun(@(k) pickN(r(c==k),m(k)), 1:size(idx,2), ...
               'UniformOutput',false);      %# sample m(k) from labels==k

%# mark selected records
LabelIndicatorMatrix = false(size(Label));
LabelIndicatorMatrix( vertcat(idx{:}) ) = true;

%# check results are correct
assert( sum(LabelIndicatorMatrix)==sum(m) )
1 голос
/ 28 июня 2011

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

Label = [1; 3; 5; ....... 6];
index = randi(N,m1,1);
index = unique(index);
LabelIndicatorMatrix = zeros(N,1);
LabelIndicatorMatrix(index)=1;

При этом я не уверен, что понимаю окончательное условие для LabelIndicatorMatrix.

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