Matlab 随机抽取具有附加权重的行

Matlab randomly sample rows with additive weights

假设我有一个一二矩阵。我想随机抽取(不替换)具有指定权重的 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,:);

我希望赋予 twos 的权重是相加的。例如,与包含 2 个二进制数的行相比,包含 3 个二进制数的行更有可能被选中。这是我在这里所做的吗?我不确定如何检查我是否正确执行此操作...

您的代码似乎工作正常。我通过创建这样的矩阵对其进行了测试:

[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 行更有可能,等等。红线基于权重,并且是预期的样本数n.

代码如下:

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

结果