Произвольно выбирайте строки матрицы с весами в MATLAB

Вопрос:

Скажем, я хочу случайным образом выбрать 3 строки из матрицы m

m = [1 2 1; 1 1 1; 1 1 1; 2 1 1; 2 2 1; 1 1 1; 1 1 1; 2 1 1];
sample = m(randsample(1:length(m),3),:)

Тем не менее, я хочу случайным образом выбирать строки с весами. Поэтому мне нужен вектор, соответствующий каждой строке m. Я хочу применить взвешивание к каждой строке в зависимости от числа (или отношения) 1 и 2, которые присутствуют в каждой строке.

Может, что-то вроде этого?

w1 = 0.6;                 %weight of 1
w2 = 0.4;                 %weight of 2
w = m;
w(w == 1) = w1;
w(w == 2) = w2;
w = (sum(w,2))*0.1        %vector of weights

Но это неправильно:

sample = m(randsample(1:length(m),2),:,true,w)

Пожалуйста помоги.

Лучший ответ:

Пребывая с вашим кодом, я думаю, вам нужно было нормализовать весы, а затем выбрать строки на основе случайных выборок, рассчитанных по randsample используя нормализованные веса. Итак, для вашего кода необходимы следующие изменения:

w = sum(w,2)./sum(sum(w,2)) %// Normalize weights
sample = m(randsample([1:size(m,1)], 3, true, w) ,:)

Или, если я могу начать и хочу сделать код кратким, я мог бы сделать так –

%// Inputs
m = [1 2 1; 1 1 1; 1 1 1; 2 1 1; 2 2 1; 1 1 1; 1 1 1; 2 1 1]
w1 = 0.6;                 %// weight of 1
w2 = 0.4;                 %// weight of 2

%// Scale each row of w according to the weights assigned for 1 and 2.
%// Thus, we will have weights for each row
sum_12wts = sum(w1.*(m==1),2) + sum(w2.*(m==2),2)

%// Normalize the weights, so that they add upto 1, as needed for use with
%// randsample
norm_weights = sum_12wts./sum(sum_12wts)

%// Get 3 random row indices from m using randsample based on normalized weights
row_ind = randsample([1:size(m,1)], 3, true, norm_weights) 

%// Index into m to get the desired output
out = m(row_ind,:)

Оцените статью
TechArks.Ru
Добавить комментарий