找到一个向量的偏移量,它最小化与另一个向量的差异

Finding the shift of a vector which minimizes the difference to another vector

如果之前有人问过类似的问题,我很抱歉。我有两个 50 x n 的向量,我想找到第一个向量的位移,它提供与第二个向量的最接近匹配。我在 Matlab 中尝试了 fminsearchcircshift,但是,在这种情况下无法准确找到如何使用它们。

我也看到了讨论here,但是,我不需要代表函数或插值来匹配两个向量。相反,我只想要一个配置文件的最佳偏移,这样可以最大限度地减少配置文件中的差异。如果你能指导我,我会很高兴。还有,我可以用fminsearch来解决这个问题吗?

这不就是OLS吗?为了澄清,我假设第二个矩阵是 Y,第一个矩阵是 X,对于 n 的一些预先指定的值,两者都具有维度 50 x n。为简单起见,堆叠矩阵,使XY(50 x n) x 150xn行和1列。那么你的模型是

Y_i = a + bX_i + e_i.

您的目标是最小化误差平方和:

min_{a,b} sum_i e_i^2. 

您可以使用 fmincon 或求解解析解。参见公式的简单线性回归:

https://en.wikipedia.org/wiki/Simple_linear_regression

你可以用gallery的循环矩阵做如下:

%// example data
A = randi([1,10],[1,10])
B = circshift(A,[0,3])

根据此数据,匹配班次预计为 3

[~,minidx] = min(sum(abs(bsxfun(@minus,A,gallery('circul',B))),2))
shift = numel(A) - minidx + 1

shift =

     3

说明

%// circulant matrix 
circul = gallery('circul',B)
%// substract vector A from all shifted rows of circulant matrix
diffs = bsxfun(@minus,A,circul)
%// sum absolute differences
C = sum(abs(diffs),2)
%// find index of row with minimum difference
[~,minidx] = min(C)
%// depending on your defintion of "shift", means
%// depending on where you start to count, you may want to
%// change this:
shift = numel(A) - minidx + 1

需要考虑的事情

这是一种蛮力方法,但矢量化且高效。但是它 分析了矢量 B 可能发生的所有可能的移位 。如果你有很长的矢量(numel > 10000+)你可以 运行 进入内存问题 fminsearch 不会。另一方面,您永远无法确定 fminsearch 会找到最佳解决方案,除非您的数据遵循清晰的模式,或者您无论如何都分析了所有变化,但那样它也会很慢。