Подтвердить что ты не робот

Понимание NumPy Convolve

При вычислении простой скользящей средней numpy.convolve выполняет задание.

Вопрос: Как выполняется расчет при использовании np.convolve(values, weights, 'valid')?

Когда в документах упоминается convolution product is only given for points where the signals overlap completely, каковы 2 сигнала, относящихся к?

Если какие-либо объяснения могут включать примеры и иллюстрации, это будет чрезвычайно полезно.

window = 10
weights = np.repeat(1.0, window)/window
smas = np.convolve(values, weights, 'valid')
4b9b3361

Ответ 1

Свертка - это математический оператор, используемый в основном для обработки сигналов. Numpy просто использует эту номенклатуру обработки сигналов, чтобы определить ее, отсюда и ссылки на "сигналы". Массив в NumPy является сигналом. Свертка двух сигналов определяется как интеграл первого сигнала, инвертированный, охватывающий ("свернутый") второй сигнал и умножаемый (со скалярным произведением) на каждую позицию перекрывающихся векторов. Первый сигнал часто называют ядром, особенно когда он представляет собой двумерную матрицу в обработке изображений или нейронных сетях, а обращение становится зеркальным отображением в 2-D (НЕ транспонировать). Это можно более четко понять, используя анимацию в Википедии.

Свертки имеют несколько определений в зависимости от контекста. Некоторые начинают свертку, когда начинается перекрытие, в то время как другие начинают, когда перекрытие только частичное. В случае "пустого" "действительного" режима перекрытие определяется как всегда завершенное. Он называется "действительным", поскольку каждое значение, указанное в результате, выполняется без экстраполяции данных.

Например, если ваш массив X имеет длину 2, а массив Y имеет длину 4, свертка X в Y в "действительном" режиме даст вам массив длиной 3.

Первый шаг для X = [4 3] и Y = [1 1 5 5]:

[3 4]                   (X is reversed from [4 3] to [3 4], see note)
[1 1 5 5]
= 3 * 1 + 4 * 1 = 7

Примечание. Если X не был перевернут, операция будет называться взаимной корреляцией вместо свертки.

Второй шаг:

  [3 4]
[1 1 5 5]
= 3 * 1 + 4 * 5 = 23

Третий шаг:

    [3 4]
[1 1 5 5]
= 3 * 5 + 4 * 5 = 35

Результатом свертки для режима "действительный" будет [7 23 35].

Если перекрытие задано как одна отдельная точка данных (как в случае режима "полный"), в результате вы получите массив длиной 5. Первый шаг:

[3 4]
  [1 1 5 5]
= 3 * undefined (extrapolated as 0) + 4 * 1 = 4

И так далее. Существуют дополнительные режимы экстраполяции.