【问题标题】:How to make weighted random sampling for matrix - MatLab如何对矩阵进行加权随机抽样 - MatLab
【发布时间】:2021-07-19 20:49:36
【问题描述】:

我想从一个从 excel 文件开始的 m x n 矩阵创建一个加权样本(“DataTab”,请参见图 1)。

第一列 (UGT) 表示矩阵的 ID,B-F 列表示与每个 UGT 的变量“fi”相关的概率。 “fi”是一个标量,其值为 10、20、30、40、50:这意味着 UGT 1101 有 50% 的概率具有值 10 或 20,UGT 1102 可以是 30 (50%) 或 40 ( 50%)等等。

我使用了仅适用于标量的“randsample 函数”,但我无法在我的情况下使用它。

fi = [10,20,30,40,50];
p = [0.15,0.20,0.30,0.10,0.25];
n=10000;
sample = randsample (fi, n, true, p);
hist(sample,fi);
bar(fi,n*p,0.7);

我将整个代码正确地与“Fv2”变量一起使用,而不是与“Fv1”一起使用,这是我的问题的目标。

Nsample = 10; 
DataTab = xlsread('Scenari_stabilita_R6.xlsx','S1','A2:f6');
Ugt   = csvread('raster_ugt.acs'); 
UgtV   = reshape(Ugt,[],1);
MRas   = [UgtV];
MCycle  = MRas(~idxNaN,:);
a=unique(MCycle(:,4));
idxDataTab=ismember(DataTab(:,1),a);
DataTab2 = DataTab(idxDataTab,:);
nUGT = length(a);    
fi = [10,20,30,40,50];
Fv = [];
    for i = 1:nUGT
        Fv1 = randsample (fi, Nsample, true, DataTab2(i,:));
        %Fv2 = (DataTab2(i,3)-DataTab2(i,2)).*rand(Nsample,1) +
        %DataTab2(i,2); % this line calculates uniform distribution and
        %it has to be modified into weighted sampling
        Fv = [Fv,Fv1];
    end

“Fv1”变量必须是这样的(没有第一行,我仅作为示例显示以更好地理解):

有人可以帮帮我吗?

@obchardon 在R2019b版本上运行后我必须在这里回答:

enter image description here enter image description here

问题是“p”来自excel文件,所以不能写成标量。我怎样才能解决这个问题? 此外,第一列中“fi”的频率不考虑输入概率。使用此代码,频率得到尊重,但您应该以某种方式更改每个 ugt 的“p”。

sample = randsample (fi, n, true, p)

【问题讨论】:

    标签: matlab matrix random probability sampling


    【解决方案1】:

    一种简单的方法是cumsum()你的概率向量,在01之间生成n随机数,并检查cumsum向量在哪个位置开始小于或等于随机数:

    % INPUT
    n  = 10
    fi = [10,20,30,40,50]       % given number
    p  = [0.3,0.3,0.2,0.1,0.1
          0.5,0.5,0  ,0  ,0 ].' % given probability
    
    % COMPUTATION
    sp = size(p)     
    rd = rand(n,1,sp(2))                   % 10x1x2 random number between 0 and 1.
    cp = reshape(cumsum(p),1,sp(1),sp(2))  % cumulative probability
    [~,ind] = max(rd<=cp,[],2)             % Get the position where rd start to be smaller or equal to cp.                     
    res = squeeze(fi(ind))                 % Extract the corresponding value
    

    res =
    
       50   20
       30   20
       10   20
       10   10
       30   10
       10   10
       10   20
       40   10
       10   20
       30   20
    

    我们只需要为rdcp 添加一个第三维度,这样它们就可以被广播了。

    % Broadcasting along the first and second dimension
    rd = 10 x 1 x 2
         ↓    ↓
    cp = 1  x 5 x 2 
    

    【讨论】:

    • 亲爱的 obchardon,从图 1 中可以看出,我没有 p 的向量,而是每个 ugt 值变化的矩阵。所以我觉得你的建议不适合我的情况。
    • @MichelePapasidero 你有,至少,运行上面的代码吗? p 是一个二维数组。
    • 从您的第二张图片中,您没有考虑我不属于代码一部分的评论,看起来您使用的是非常旧的 matlab 版本。广播仅适用于 Matlab 2016b 及更高版本。
    • 我做到了,请看我上面的回答。
    • Stackoverflow 不是代码编写服务,它旨在为一般问题提供一般答案。之后,如果您无法针对特定情况调整代码,您应该聘请开发人员或阅读一些教程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多