Скажем, я хочу случайным образом выбрать 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,:)