Algorithm 递归计算数据的运行平均值

Algorithm 递归计算数据的运行平均值,algorithm,matlab,statistics,logic,weighted-average,Algorithm,Matlab,Statistics,Logic,Weighted Average,我有两个2D矩阵A和B,其中行表示试验,列表示试验期间采集的样本 我所处的场景是a可用,但B是实时收集的。我想计算{A的运行平均值和B}的可用数据,因为B正在采样。我想我可以通过计算a和B的加权平均值来实现这一点,并在收集B的试验和样本时更新权重。具体地说,我认为我可以更新权重,并递归地使用上一次迭代中保存的值。下面是我的代码和输出图: close all; clear all; %define the sizes of the matrices -- exact numbers aren't

我有两个2D矩阵
A
B
,其中行表示试验,列表示试验期间采集的样本

我所处的场景是
a
可用,但
B
是实时收集的。我想计算{
A
的运行平均值和
B
}的可用数据,因为
B
正在采样。我想我可以通过计算
a
B
的加权平均值来实现这一点,并在收集
B
的试验和样本时更新权重。具体地说,我认为我可以更新权重,并递归地使用上一次迭代中保存的值。下面是我的代码和输出图:

close all;
clear all;

%define the sizes of the matrices -- exact numbers aren't important for illustration
n1 = 5;
n2 = 10;
n3 = 12;

%define a matrix that will act as the history of data already collected
A = randi(10,[n2,n1]);
A_avg = mean(A,1); %averaged across n2 trials to get n1 values

%current acts as "incoming" data
B = randi(10,[n3,n1]); %n3 trials, n1 samples per trial

%preallocate matrices for final solutions
correct_means = zeros(n3,n1);
estimated_means = zeros(n3,n1);

for k1=1:size(B,1) %loop through trials
    %get running average in the case where we already have all samples
    correct_means(k1,:) = mean([A;B([1:k1],:)],1);
    for k2=1:size(B,2) %k2 should loop through samples
        %calculate averages as samples are incoming recursively (weighted averaging)
        if k1>1
            estimated_means(k1,k2) = (n2 / (n2+k1)) * A_avg(k2)...
                + ((k1-1)/(n2+k1)) * estimated_means(k1-1,k2) + (1/(n2+k1)) * B(k1,k2);
        elseif k1==1
            estimated_means(k1,k2) = (n2 / (n2+k1)) * A_avg(k2)...
                + ((k1-1)/(n2+k1)) * estimated_means(k1,k2) + (1/(n2+k1)) * B(k1,k2);       
        end
%         if k1==2, keyboard; end
    end
end

%plot the results
figure; hold on;
plot(nan, 'b', 'displayname', 'correct solution');
plot(nan, 'k--', 'displayname', 'my solution');
leg_tmp = legend('show');
set(leg_tmp,'Location','Best');

plot(correct_means, 'b', 'displayname', 'correct solution');
plot(estimated_means, 'k--', 'displayname', 'my solution');

ylabel('running averages');
xlabel('samples');

所附的图概述了我尝试的解决方案(黑色)和我认为正确的答案(蓝色)。请注意,我只是在获取所有试验的所有样本后绘制平均值,但在收集数据时保存运行平均值。正如你所看到的,我的答案似乎有点不对劲

我的想法是,
A
应该通过收集
B
时用于确定其平均值的试验分数与试验总数进行更新。同样地,
B
的当前样本的权重仅为1除以迭代中当前试验的总数,并且递归调用
B
的先前样本并相应地加权。这些重量加起来等于1,对我来说很有意义,所以我很难看出我把事情搞砸了


“谁能看到我在搞砸什么地方?”/P> < P>你应该考虑,代码越长,它积累的bug就越多。

我提前表示歉意,对我来说,重写业务逻辑比在代码中找到bug要容易得多——因此,尽管结果可能与您想要的不完全一样,但它确实提供了一个修复方案。我希望你仍然会觉得这很有用

请看一个稍微简化的版本,它似乎能产生正确的结果:

功能q60180320
rng(60180320);%为了再现性
%定义矩阵的大小
n1=5;
n2=10;
n3=12;
%定义一个矩阵,用作已收集数据的历史记录
A=randi(10,[n2,n1]);
A_平均值=平均值(A,1);%在n2试验中取平均值,以获得n1值
%当前数据充当“传入”数据
B=randi(10[n3,n1]);%n3次试验,每次试验n1个样品
正确的_表示=cumsum([A;B],1)。/(1:n2+n3)。”;正确的意思=正确的意思(n2+1:结束,:);
%预分配矩阵
估计的_平均值=零(n3+1,n1);
估计平均值(1,:)=A平均值;%在循环中避免if子句的技巧
对于k1=1:尺寸(B,1)%循环试验
%%计算权重:
totalRows=n2+k1;
W_old=(totalRows-1)。/totalRows;
W_new=1/行总数;
%%传入测量(假设一次有整行B可用)
newB=B(k1,:);
%%计算运行平均值
估计平均数(k1+1,:)=W_旧*估计平均数(k1,:)+W_新*新;
结束
估计平均数=估计平均数(2:结束:);%删除第一行;
%绘制结果
图形等等
绘图(nan,'k','displayname','correct solution');
绘图(nan,‘w--’、‘displayname’、‘我的解决方案’);
leg_tmp=图例(“显示”);
设置(支腿、tmp、“位置”、“东外”);
绘图(正确的_表示“k”,“显示名称”,“正确的解决方案”,“线宽”,2);
绘图(估计_表示“w-”、“displayname”、“我的解决方案”);
ylabel(“运行平均值”);
xlabel(“样本”);