Оценка ядра с учетом оригинальных и извилистых данных 1D - PullRequest
0 голосов
/ 22 февраля 2019

Я не могу понять, как найти ядро, используемое для свертки, с учетом исходных и извитых данных.Например, если у меня есть 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 Ответ

0 голосов
/ 24 февраля 2019

Если мы обозначим входной вектор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...