Объясните функцию MATLAB smooth(x,y,span,'moving')

Недавно я наткнулся на гладкую функцию Matlab, используемую следующим образом:

ans = smooth(x, y, span, 'moving');

В документации Matlab указано

yy = smooth(x,y,...) дополнительно указывает данные x. Если x не указан, методы, требующие данных x, предполагают, что x = 1:length(y). Вы должны указать данные x, если они неравномерно распределены или отсортированы. Если x не является однородным и вы не указываете метод, используется lowess. Если метод сглаживания требует сортировки x, сортировка выполняется автоматически.

Однако мне неясно, что это на самом деле означает для случая «скользящего» среднего. Является ли x индексом для данных y, и если да, то как нецелые значения x влияют на «скользящее» среднее значение y?


person hanna    schedule 16.11.2015    source источник


Ответы (3)


Скользящее среднее означает, что каждое значение yy (или ans в вашем случае) является средним значением n ближайших точек. https://en.wikipedia.org/wiki/Moving_average Существует несколько методов его расчета. - это зависит от того, КАКИЕ ПУНКТЫ мы будем использовать. Например:

( (i-1) + (i-2) + ... + (i-n) )/n;

где n - это span или уровень линейной фильтрации. Это означает, что первые три точки не могут быть рассчитаны (для них нет данных). И иногда результат должен быть смещен (потому что действительно - среднее первых 4-х точек не очень соответствует 4-м элементам).

Итак, Matlab использует другой метод:

yy(1) = y(1)
yy(2) = (y(1) + y(2) + y(3))/3
yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5
yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5
...

Это более полезно.

Насчет x и y - это обычные 2d-данные: каждому x соответствует каждый y. вы можете избежать установки x, тогда Matlab будет использовать для этого последовательность [1, 2, 3, ..., length(y)]. Но если у вас есть какие-то неравномерно распределенные данные, вы должны установить их для получения правильного результата. Поэтому, если у вас есть нецелые значения, они будут работать правильно, масштабируя их по оси x. Вот самый простой пример из моей головы: введите здесь описание изображения

person Mikhail_Sam    schedule 16.11.2015
comment
Чтобы убедиться, что я вас понимаю: нецелые числа x со скользящим средним просто используются для упорядочения, а результирующий сглаженный y такой же, как если бы вы проецировали порядок на целочисленный индекс? - person hanna; 16.11.2015
comment
Сорри, я не понимаю, что такое «нецелое число, прогнозированное на целочисленный индекс», но посмотрите на мой график — точки полученной сглаженной функции (красные) имеют те же нецелочисленные значения x, что и используемые данные (синие). Это означает, что smooth учитывает разную длину между точками для оси x, но результирующие точки не будут иметь целочисленных значений x, а будут такими же, как x-данные, которые вы направляете в smooth. - person Mikhail_Sam; 17.11.2015

Допустим, у вас есть данные y, искаженные шумом, и предположим, что y = [2.1, 3.2, 1.7, 4.5, 5.8, 6.9]. Допустим, вы решили использовать скользящее среднее 3-х оконного фильтра для сглаживания y.

smoothedY1 = (2.1 + 3.2 + 1.7)/3 = 2.3333
smoothedY2 = (3.2 + 1.7 + 4.5)/3 = 3.1333
smoothedY3 = (1.7 + 4.5 + 5.8)/3 = 4.0000
smoothedY3 = (4.5 + 5.8 + 6.9)/3 = 5.7333

Обратите внимание на то, как поврежденные данные смещаются влево на один элемент за итерацию. Теперь воспользуемся smooth() в Matlab.

y = [2.1, 3.2, 1.7, 4.5, 5.8, 6.9];
smooth(y, 3, 'moving')

Приведенный выше скрипт дает следующий результат

ans =
    2.1000
    2.3333 <----
    3.1333      |  (smoothed data)
    4.0000      | 
    5.7333 <----
    6.9000
person CroCo    schedule 10.12.2015

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

>> x = rand(10, 1);
>> y = (1:10)' + 0.1*randn(10,1);
>> isequal(smooth(x,y,'moving'), smooth(y,'moving'))
ans =
   0
>> z = sortrows([x y], 1);
>> isequal(smooth(z(:,1),z(:,2),'moving'), smooth(z(:,2),'moving'))
ans =
   1

Значения «x» на самом деле не учитываются при усреднении, они просто используются для сортировки «y» по возрастанию индекса.

person CKT    schedule 04.04.2016