Matlab随机对具有附加权重的行进行采样

时间:2015-01-22 05:11:35

标签: matlab

假设我有一个二进制矩阵。我想随机采样(无需替换)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个二进制的行。这是我在这里做的吗?我不确定如何检查我是否已正确完成此操作......

1 个答案:

答案 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

结果 enter image description here