Как свертка работает в stats :: filter - PullRequest
1 голос
/ 15 января 2020

Я прочитал несколько ответов, которые касаются статистики: отфильтровали, они частично прояснили, как работает свертка (часть, которая связана с расположением коэффициентов), но есть и другие моменты.

пример:

# convolution with 3 coefficients in filter
filter(1:5,c(f1,f2,f3),method="convolution")
[1] NA  6  9 12 NA

#equivalent to:
 NA  * f3 + x[1] * f2 + x[2] * f1  #x[0] = doesn't exist/NA
x[1] * f3 + x[2] * f2 + x[3] * f1
x[2] * f3 + x[3] * f2 + x[4] * f1 
x[3] * f3 + x[4] * f2 + x[5] * f1 
x[4] * f3 + x[5] * f2 + x[6] * f1 #x[6] also doesn't exist

Я не понимаю, откуда взялся Х [0]; Я думал, что мы начнем с х [1]. Я подозреваю, что это может быть связано со смещением, упомянутым в справочном документе для stats::filter.

. Фильтр свертки имеет вид

y [i] = f [1] * x [ i + o] +… + f [p] * x [i + o- (p-1)]

где o - смещение: см. стороны для определения того, как оно определяется.

стороны: только для сверточных фильтров. Если сторон = 1, коэффициенты фильтра только для прошлых значений; если стороны = 2, они центрированы вокруг запаздывания 0. В этом случае длина фильтра должна быть нечетной, но если она четная, больше фильтра вперед по времени, чем назад.

I Я все еще в замешательстве. Я не вижу, как стороны объясняют смещение, и не уверен, что x[0] 'было связано со смещением.

как свертка действительно работает в stats :: filter?

1 Ответ

1 голос
/ 15 января 2020

Вероятно, вы должны узнать, что такое свертка. Начните с самого простого. ie свертка двух сигналов. Я просто опишу детали. Но вы можете искать WHY онлайн.

Так что filter(1:5,c(f1,f2,f3),method="convolution"), по умолчанию используется 2 стороны. Это фильтр, по которому фильтр будет отцентрирован, и если это невозможно, то более крупный конец будет в данных. Вычисление начинается там, где центр фильтра совпадает с первым значением сигнала. Напомним, что поскольку фильтр проходит по сигналу, он должен быть меньше или равен длине сигнала. Вот пример.

если фильтр, например, c(1,2,3), тогда мы будем центрировать его на 2.

, таким образом, чтобы свести c(1,2,3,4,5) с c(1,2,3), мы сначала reverse затем фильтр rollapply это по всему signal:

шаг 1

    1  2  3  4  5
 3  2  1
  We see that 3 is not multiplied by anything! Thus `3*NA + 2*1+1*2 = NA`

Затем мы перемещаем фильтр на один шаг и делаем математику снова

     1  2  3  4  5
     3  2  1
   Here all the values are present: 3*1+2*2+1*3 = 10

Третий шаг:

  1  2  3  4  5
     3  2  1
  3*2+2*3+1*4 = 16

Мы повторяем это до тех пор, пока центрированное значение ie 2 не совпадет с последним значением.

Если вы выберете side = 1, то он не будет центрироваться, а будет начинаться с совпадения последнего значения фильтра с первым значением сигнала и конечного значения sh путем совпадения последнего значения фильтра с последнее значение сигнала.

...