找到一个向量的偏移量,它最小化与另一个向量的差异
Finding the shift of a vector which minimizes the difference to another vector
如果之前有人问过类似的问题,我很抱歉。我有两个 50 x n 的向量,我想找到第一个向量的位移,它提供与第二个向量的最接近匹配。我在 Matlab 中尝试了 fminsearch
和 circshift
,但是,在这种情况下无法准确找到如何使用它们。
我也看到了讨论here,但是,我不需要代表函数或插值来匹配两个向量。相反,我只想要一个配置文件的最佳偏移,这样可以最大限度地减少配置文件中的差异。如果你能指导我,我会很高兴。还有,我可以用fminsearch
来解决这个问题吗?
这不就是OLS吗?为了澄清,我假设第二个矩阵是 Y,第一个矩阵是 X,对于 n
的一些预先指定的值,两者都具有维度 50 x n
。为简单起见,堆叠矩阵,使X
和Y
为(50 x n) x 1
(50xn
行和1
列。那么你的模型是
Y_i = a + bX_i + e_i.
您的目标是最小化误差平方和:
min_{a,b} sum_i e_i^2.
您可以使用 fmincon 或求解解析解。参见公式的简单线性回归:
你可以用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
会找到最佳解决方案,除非您的数据遵循清晰的模式,或者您无论如何都分析了所有变化,但那样它也会很慢。
如果之前有人问过类似的问题,我很抱歉。我有两个 50 x n 的向量,我想找到第一个向量的位移,它提供与第二个向量的最接近匹配。我在 Matlab 中尝试了 fminsearch
和 circshift
,但是,在这种情况下无法准确找到如何使用它们。
我也看到了讨论here,但是,我不需要代表函数或插值来匹配两个向量。相反,我只想要一个配置文件的最佳偏移,这样可以最大限度地减少配置文件中的差异。如果你能指导我,我会很高兴。还有,我可以用fminsearch
来解决这个问题吗?
这不就是OLS吗?为了澄清,我假设第二个矩阵是 Y,第一个矩阵是 X,对于 n
的一些预先指定的值,两者都具有维度 50 x n
。为简单起见,堆叠矩阵,使X
和Y
为(50 x n) x 1
(50xn
行和1
列。那么你的模型是
Y_i = a + bX_i + e_i.
您的目标是最小化误差平方和:
min_{a,b} sum_i e_i^2.
您可以使用 fmincon 或求解解析解。参见公式的简单线性回归:
你可以用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
会找到最佳解决方案,除非您的数据遵循清晰的模式,或者您无论如何都分析了所有变化,但那样它也会很慢。