2014-09-23 4 views
3

Мне нужно вычислить скользящее среднее по ряду данных в цикле for. Я должен получить скользящую среднюю за N = 9 дней. Массив, который я вычисляю, представляет собой 4 серии из 365 значений (M), которые сами по себе являются средними значениями другого набора данных. Я хочу построить средние значения моих данных со скользящей средней на одном участке.Вычисление скользящей средней

Я гугл немного о скользящем средних и команде «ко» и нашел то, что я попытался реализующим в моем коде .:

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 

Так в основном, я вычисляю свою середину и построить его с (неправильно) скользящая средняя. Я выбрал значение «wts» прямо на сайте mathworks, так что это неверно. (источник: http://www.mathworks.nl/help/econ/moving-average-trend-estimation.html) Моя проблема заключается в том, что я не понимаю, что это за «wts». Может ли кто-нибудь объяснить? Если это имеет какое-то отношение к весам значений: это недопустимо в этом случае. Все значения взвешиваются одинаково.

И если я делаю это совершенно неправильно, могу ли я получить некоторую помощь?

Я искренне благодарю вас.

ответ

3

Использование conv - отличный способ реализовать скользящую среднюю. В коде, который вы используете, wts - сколько вы взвешиваете каждое значение (как вы догадались). сумма этого вектора всегда должна быть равна единице. Если вы хотите, чтобы равномерно нагрузить каждое значение и сделать двигающийся фильтр размера N, то вы хотели бы сделать

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

Используя «действующий» аргумента в ко приведут иметь меньше значения в Ms, чем у вас есть в М. Используйте «same», если вы не против эффектов нулевого заполнения. Если у вас есть панель обработки сигналов, вы можете использовать cconv, если хотите попробовать круговую скользящую среднюю. Что-то вроде

N = 7; 
wts = ones(N,1)/N; 
cconv(x,wts,N); 

должно работать.

Для получения дополнительной информации вы должны прочитать документацию conv и cconv, если вы еще этого не сделали.

+0

Спасибо за помощь, это работает, как хорошо! –

0

Я хотел бы использовать это:

% 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 

разорвал прямо из here.

Прокомментировать текущую реализацию. wts - это вектор взвешивания, который из Mathworks является средним значением в 13 баллов, с особым вниманием к первой и последней точке весовой доли остальных.

+0

Спасибо, я думаю, что понял это сейчас! –

4

Есть еще два варианта:

1) filter

Из дока:

Вы можете использовать filter найти скользящее среднее, не используя для цикла. В этом примере найденное среднее значение вектора из 16 элементов, используя размер окна , равный 5.

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

2) smooth как часть подгонки кривой Toolbox (который доступен в большинстве случаев)

Из Doc:

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

В 2016 MATLAB добавлена ​​функция movmean, которая вычисляет скользящее среднее:

N = 9; 
M_moving_average = movmean(M,N) 
Смежные вопросы