在给定原始数据和卷积数据的情况下,我不知道如何找到用于卷积的内核。例如,如果我有1D数据X,并且对某些内核phi应用了卷积,我将得到像这样的输出convoluted_x。
[
{
"operation": "shift",
"spec": {
"address": {
"*": {
"@value": "address.&1"
}
},
"id|marital_status|author_id|company": "&",
"*": {
"@value": "&1"
}
}
}
]
此处,X_conv为[-2 -2 -2 -2 -2 -2 -2 -2 -2 -2 9]。
我的问题是,如果仅给出X和X_conv,是否有任何方法可以找到用于卷积的内核phi?
答案 0 :(得分:1)
如果我们用X
表示输入向量,而用Y
表示输出(卷积)向量,则每个Y(i)
都是由{{1 }}:
X
Y(i) = Sum{j} X(j) * kernel(kernelIndex(i, j))
是为给定卷积提供特定位置来访问内核的函数,并且通常与实现相关(即,如何索引输入/输出)。
出于我们的目的,kernelIndex
和Y(i)
是已知的,X(j)
是未知的。因此,对于每个输出kernel(…)
,我们可以陈述一个线性方程(如上所述)。我们可以收集所有这些方程式,并求解未知的内核条目。这是Matlab中的示例实现:
Y(i)
您可以使用此函数获取内核:
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