假设我有一个二进制矩阵。我想随机采样(无需替换)2行指定权重。这就是我在这里所做的(我想?):
x = [1 1 1 2 1; 1 2 1 1 1; 1 1 1 1 1; 1 2 2 1 2; 1 2 2 1 1];
w1 = 1; % weight of ones
w2 = 4; % weight of twos
sum_wts = sum(w1.*(x==1),2) + sum(w2.*(x==2),2); %normalise weights
norm_weights = sum_wts./sum(sum_wts);
row_ind = randsample([1:size(x,1)], 2, true, norm_weights); %take random sample
new_x = x(row_ind,:);
我希望给予两个人的重量是加性的。例如,与包含2个二进制的行相比,更可能选择包含3个二进制的行。这是我在这里做的吗?我不确定如何检查我是否已正确完成此操作......
答案 0 :(得分:1)
您的代码似乎正常运行。我通过创建这样的矩阵来测试它:
[2 1 1 1 1
2 2 1 1 1
2 2 2 1 1
2 2 2 2 1
2 2 2 2 2]
并使您的代码生成大量样本,并为行n的选择频率制作直方图。我希望如果你的代码工作,当n增加时,条形应该变高,也就是说,第5行比第4行更可能,等等。红线基于权重,并且是预期的行样本数量ñ
以下是代码:
x=ones(5)+tril(ones(5))
w1 = 1; % weight of ones
w2 = 4; % weight of twos
sum_wts = sum(w1*(x==1),2) + sum(w2*(x==2),2); %normalise weights
norm_weights = sum_wts./sum(sum_wts);
row_ind = randsample([1:size(x,1)], 2000000, true, norm_weights); %take random sample
new_x = x(row_ind,:);
hist(row_ind,1:5)
hold on
plot(1:5,2000000*norm_weights,'r','LineWidth',4)
hold off
结果