给定原始和复杂一维数据的核估计

在给定原始数据和卷积数据的情况下,我无法弄清楚如何找到用于卷积的内核。例如,如果我有 1D 数据 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 ?


30秒到达战场
浏览 214回答 1
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)&nbsp; &nbsp; sizeOfSource = size(source);&nbsp; &nbsp; sizeOfSource = sizeOfSource(2);&nbsp; &nbsp; % linear system A x = b&nbsp; &nbsp; A = zeros(sizeOfSource, kernelSize);&nbsp; &nbsp; b = zeros(sizeOfSource, 1);&nbsp; &nbsp; for i = 1 : sizeOfSource&nbsp; &nbsp; &nbsp; &nbsp; for j = 1 : kernelSize&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sourceIndex = i + (kernelSize - j) - floor(kernelSize / 2);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if sourceIndex >= 1 && sourceIndex <= sizeOfSource&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; A(i, j) = source(sourceIndex);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end&nbsp; &nbsp; &nbsp; &nbsp; end&nbsp; &nbsp; &nbsp; &nbsp; b(i, 1) = target(i);&nbsp; &nbsp; end&nbsp; &nbsp; % solve the linear system&nbsp; &nbsp; 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 =&nbsp; &nbsp;-1.0000&nbsp; &nbsp;-0.0000&nbsp; &nbsp; 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 =&nbsp; &nbsp;-0.0000&nbsp; &nbsp;-1.0000&nbsp; &nbsp;-0.0000&nbsp; &nbsp; 1.0000&nbsp; &nbsp;-0.0000
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python