Нахождение смещения вектора, который минимизирует разницу в другой вектор

Мне очень жаль, если подобный вопрос был задан ранее. У меня есть два вектора по 50 xn, и я хочу найти сдвиг первого вектора, который обеспечивает наиболее близкое соответствие со вторым вектором. я пытался fminsearch а также circshift в Matlab, однако, не смог точно найти, как их использовать в этом случае.

Я также видел обсуждение здесь, однако мне не нужна репрезентативная функция или интерполяция для соответствия двум векторам. Вместо этого я просто хочу получить лучшее смещение одного профиля, что минимизирует различия по профилю. Я буду счастлив, если вы сможете направить меня. Кроме того, я мог бы использовать fminsearch Для решения этой проблемы?

2 ответа

Решение

Вы можете сделать это следующим образом с 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

Что нужно учитывать

Это своего рода метод грубой силы, хотя и векторизованный и эффективный. Но он анализирует все возможные сдвиги, которые могут произойти с вектором В. Если у вас действительно длинные векторы (число> 10000+), вы можете столкнуться с проблемами памяти, когда fminsearch не будет. С другой стороны, вы никогда не можете быть уверены, fminsearch нашел бы лучшее решение, если ваши данные не следуют четкой схеме или вы все равно не проанализируете все сдвиги, но тогда это тоже будет медленным.

Разве это не просто OLS? Чтобы уточнить, я предполагаю, что вторая матрица Y и первая матрица X, оба имеют размерность 50 x n для некоторого предварительно определенного значения для 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 или решить для аналитического решения. Смотрите простые линейные регрессии для формул:

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

Другие вопросы по тегам