代码之家  ›  专栏  ›  技术社区  ›  BenJHC

使用每个bin的相同平均值对2个变量的值进行Binning

  •  -1
  • BenJHC  · 技术社区  · 8 年前

    如何将两个不同组中的数据装箱到以相同值为中心的箱子中?

    以玩具为例,

    A(:,1) = [0.05:0.05:0.80]';
    A(:,2) = [ones(7,1); [0.6; 0.6; 0.4]; zeros(6,1)];
    B(:,1) = [0.15:0.1:0.95]';
    B(:,2) = [ones(4,1); [0.8; 0.8; 0.2]; zeros(2,1)];
    plot(A(:,1),A(:,2)); hold on; plot(B(:,1),B(:,2));
    

    我想在同一个图上对A和B进行装箱和绘图,但数据装箱在X轴上的点0.2、0.4、0.6和0.8,这意味着每个箱子中的数据都不均匀。我应该如何用以这些点为中心的平均值对这些值进行分组?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Tommaso Belluzzo    8 年前

    你的要求有点不清楚,但仔细阅读这些文字和你的评论,我认为这就是你想要的:

    edges = [0.2 0.4 0.6 1];
    
    A(:,1) = (0.05:0.05:0.80).';
    A(:,2) = [ones(7,1); [0.6; 0.6; 0.4]; zeros(6,1)];
    [~,A_bins] = histc(A(:,1),edges);
    [A_bin_vals,~,A_idx] = unique(A_bins);
    A_avg = accumarray(A_idx,A(:,2),[numel(A_bin_vals) 1],@mean) ;
    
    B(:,1) = (0.15:0.1:0.95).';
    B(:,2) = [ones(4,1); [0.8; 0.8; 0.2]; zeros(2,1)];
    [~,B_bins] = histc(B(:,1),edges);
    [B_bin_vals,~,B_idx] = unique(B_bins);
    B_avg = accumarray(B_idx,B(:,2),[numel(B_bin_vals) 1],@mean) ;
    
    plot(0:3,A_avg,'-.r*'),hold on,plot(0:3,B_avg,'-.b*'),hold off;
    xticks(0:3);
    xticklabels({'0.2' '0.4' '0.6' '0.8'});
    

    输出:

    Result

    实际上,为了实现这一点,我使用 histc . 然后,使用 accumarray function ,我应用了 mean function 到按分组的第二列的所有值 bin .