给定原始和复杂的一维数据的核估计
Kernel estimation given original and convoluted 1D data
我不知道如何在给定原始数据和卷积数据的情况下找到用于卷积的内核。例如,如果我有一维数据 X 并且我应用了一些内核 phi 的卷积,我将得到这样的输出 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?
如果我们用 X
表示输入向量,用 Y
表示输出(卷积)向量,那么每个 Y(i)
都由 Y(i)
的某些元素的线性组合组成=14=]:
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
我不知道如何在给定原始数据和卷积数据的情况下找到用于卷积的内核。例如,如果我有一维数据 X 并且我应用了一些内核 phi 的卷积,我将得到这样的输出 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?
如果我们用 X
表示输入向量,用 Y
表示输出(卷积)向量,那么每个 Y(i)
都由 Y(i)
的某些元素的线性组合组成=14=]:
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