Оценка ядра с учетом оригинальных и извилистых данных 1D
Я не могу понять, как найти ядро, используемое для свертки, учитывая исходные данные и извилистые данные. Например, если у меня есть 1D-данные X и я применяю свертку с некоторой фи ядра, я получу вывод convoluted_x следующим образом.
import numpy as np
X = np.asarray([1,2,3,4,5,6,7,8,9,10])
phi = np.asarray([-1,0,1])
X_conv = np.convolve(X, phi, mode='same')
print(X_conv)
здесь X_conv составляет [-2 -2 -2 -2 -2 -2 -2 -2 -2 9].
Мой вопрос: если даны только X и X_conv, есть ли способ найти phi ядра, который используется для свертки?
1 ответ
Если мы обозначим входной вектор с X
и выходной (извилистый) вектор с Y
тогда каждый Y(i)
состоит из линейной комбинации некоторых элементов X
:
Y(i) = Sum{j} X(j) * kernel(kernelIndex(i, j))
kernelIndex
это функция, которая дает вам определенную позицию для доступа к вашему ядру для данной свертки и обычно зависит от реализации (то есть, как вы индексируете свой ввод / вывод).
Для наших целей Y(i)
а также X(j)
известны и kernel(…)
неизвестны. Для каждого выхода Y(i)
поэтому мы можем сформулировать линейное уравнение (как указано выше)`. Мы можем собрать все эти уравнения и решить для неизвестных записей ядра. Вот пример реализации в Matlab:
function [kernel] = solveConv(source, target, kernelSize)
sizeOfSource = size(source);
sizeOfSource = sizeOfSource(2);
% linear system A x = b
A = zeros(sizeOfSource, kernelSize);
b = zeros(sizeOfSource, 1);
for i = 1 : sizeOfSource
for j = 1 : kernelSize
sourceIndex = i + (kernelSize - j) - floor(kernelSize / 2);
if sourceIndex >= 1 && sourceIndex <= sizeOfSource
A(i, j) = source(sourceIndex);
end
end
b(i, 1) = target(i);
end
% solve the linear system
kernel = A \ b;
end
Вы можете использовать эту функцию, чтобы получить ваше ядро:
>> solveConv([1,2,3,4,5,6,7,8,9,10], [-2 -2 -2 -2 -2 -2 -2 -2 -2 9],3)
ans =
-1.0000
-0.0000
1.0000
Или, если вы не уверены в размере ядра, попробуйте большее ядро:
>> solveConv([1,2,3,4,5,6,7,8,9,10], [-2 -2 -2 -2 -2 -2 -2 -2 -2 9],5)
ans =
-0.0000
-1.0000
-0.0000
1.0000
-0.0000