计算移动平均值

4

我需要在for循环内计算数据系列的移动平均值。我需要计算N=9天内的移动平均值。我正在计算的数组是365个值的4个系列(M),它们本身是另一组数据的平均值。我想在一个图中绘制我的数据的平均值和移动平均值。

我对移动平均和“conv”命令进行了一些谷歌搜索,并找到了一些我尝试在我的代码中实现的东西。

hold on
for ii=1:4;
    M=mean(C{ii},2)
    wts = [1/24;repmat(1/12,11,1);1/24];
    Ms=conv(M,wts,'valid')
    plot(M)
    plot(Ms,'r')

end
hold off

所以基本上,我计算了平均值并用(错误的)移动平均线绘制出来。我从mathworks网站上选取了"wts"的值,所以这是不正确的。(来源:http://www.mathworks.nl/help/econ/moving-average-trend-estimation.html)然而,我的问题是我不明白这个“wts”是什么。有谁能解释一下吗?如果它与数值的权重有关:在这种情况下是无效的。所有的值都具有相同的权重。如果我完全做错了,请问我能得到一些帮助吗?非常感谢。
4个回答

5

2016年,MATLAB增加了movmean函数用于计算移动平均:

N = 9;
M_moving_average = movmean(M,N)

5

还有两种替代方法:

1) filter

从文档中可以看到:

你可以使用filter函数来寻找一个运行平均值而不使用for循环。这个例子使用窗口大小为5,对一个由16个元素组成的向量进行运行平均。

data = [1:0.2:4]'; %'
windowSize = 5;
filter(ones(1,windowSize)/windowSize,1,data)

2) smooth 是 Curve Fitting Toolbox 的一部分(在大多数情况下可用)

来自文档:

yy = smooth(y) 使用移动平均滤波器平滑列向量y中的数据。结果以列向量yy返回。移动平均的默认跨度为5。

%// Create noisy data with outliers:

x = 15*rand(150,1); 
y = sin(x) + 0.5*(rand(size(x))-0.5);
y(ceil(length(x)*rand(2,1))) = 3;

%//  Smooth the data using the loess and rloess methods with a span of 10%:

yy1 = smooth(x,y,0.1,'loess');
yy2 = smooth(x,y,0.1,'rloess');

4

使用conv是实现移动平均的一种极好方式。在您正在使用的代码中,wts是您赋予每个值的权重(正如您所猜测的那样),该向量的总和应始终等于1。如果您希望每个值具有相同的权重并执行大小为N的移动过滤器,则应执行以下操作:

N = 7;
wts = ones(N,1)/N;
sum(wts) % result = 1

在conv函数中使用'valid'参数将导致Ms中的值比M中的值少。如果您不介意零填充的效果,请使用'same'。如果您有信号处理工具箱,可以使用cconv尝试循环移动平均值。类似这样的:
N = 7;
wts = ones(N,1)/N;
cconv(x,wts,N);

应该能够正常工作。

如果您还没有阅读convcconv文档,请先阅读这些文档以获取更多信息。


1
我会使用这个:
% does moving average on signal x, window size is w
function y = movingAverage(x, w)
   k = ones(1, w) / w
   y = conv(x, k, 'same');
end

这里直接获取。

对于您当前的实现进行评论。 wts是加权向量,来自Mathworks,是一个13点平均值,特别注意权重的第一个和最后一个点是其余点权重的一半。


谢谢,我现在想我已经弄明白了! - Dennis Alders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接