поиск матрицы через оптимизацию

Я ищу алгоритм для решения следующей задачи:

У меня есть два набора векторов, и я хочу найти матрицу, которая лучше всего аппроксимирует преобразование входных векторов в выходные векторы.

векторы 3x1, поэтому матрица 3x3.

Это общая проблема. Моя конкретная проблема заключается в том, что у меня есть набор цветов RGB и другой набор, содержащий нужный цвет. Я пытаюсь найти преобразование RGB в RGB, которое дало бы мне цвета ближе к желаемым.

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


person shodanex    schedule 13.10.2009    source источник
comment
Есть ли у вас соответствие между векторами в двух наборах (т. е. должен ли набор 1, вектор 1 сопоставляться с набором 2, вектором 1)?   -  person Drew Hall    schedule 13.10.2009
comment
Это какая-то гамма-коррекция? или отображение гистограммы?   -  person RobS    schedule 13.10.2009


Ответы (3)


Вы не указываете язык, но вот как я подошел бы к проблеме в Matlab.

  • v1 - это матрица 3xn, содержащая ваши входные цвета в вертикальных векторах.
  • v2 также представляет собой матрицу 3xn, содержащую ваши выходные цвета.

Вы хотите решить систему

M*v1 = v2
M = v2*inv(v1)

Однако v1 необратима напрямую, так как это не квадратная матрица. Matlab решит это автоматически с помощью операции mrdivide (M = v2/v1), где M — наиболее подходящее решение.

eg: 
>> v1 = rand(3,10);
>> M = rand(3,3);
>> v2 = M * v1;
>> v2/v1 - M

ans =

   1.0e-15 *

    0.4510    0.4441   -0.5551
    0.2220    0.1388   -0.3331
    0.4441    0.2220   -0.4441

>> (v2 + randn(size(v2))*0.1)/v1 - M
ans =

    0.0598   -0.1961    0.0931
   -0.1684    0.0509    0.1465
   -0.0931   -0.0009    0.0213

Это дает более независимое от языка решение о том, как решать проблему.

person Kena    schedule 15.10.2009
comment
Было бы здорово, я работаю со статическими данными, так что могу попробовать в матлабе - person shodanex; 15.10.2009
comment
Принято из-за ссылки, которая помогла мне найти и найти хорошее объяснение этой проблемы. - person shodanex; 20.10.2009

Это классическая задача линейной алгебры, ключевая фраза для поиска — «множественная линейная регрессия».

Мне приходилось кодировать некоторые варианты этого много раз на протяжении многих лет. Например, код для калибровки планшета дигитайзера или сенсорного экрана стилуса использует ту же математику.


Вот математика:

Пусть p — входной вектор, а q — соответствующий выходной вектор.

Преобразование, которое вы хотите, представляет собой матрицу 3x3; назовите его A.

Для одного входного и выходного векторов p и q существует вектор ошибок e

e = q - A x p

Квадрат величины ошибки представляет собой скалярную величину:

eT x e = (q - A x p)T x ( q – A x p)

(где оператор T транспонирован).

Что вы действительно хотите минимизировать, так это сумму значений e по наборам:

E = сумма (e)

Этот минимум удовлетворяет матричному уравнению D = 0, где

D(i,j) = частная производная от E по A(i,j)

Скажем, у вас есть N входных и выходных векторов.

Ваш набор входных 3-векторов представляет собой матрицу 3xN; назовите эту матрицу P. i-й столбец P является i-м входным вектором.

То же самое и с набором выходных 3-векторов; назовите эту матрицу Q.

Когда вы перемалываете всю алгебру, решение

A = Q x PT x (P x PT) ^- 1

(где ^-1 — обратный оператор — извините за отсутствие надстрочных и подстрочных индексов)


Вот алгоритм:

Создайте матрицу 3xN P из набора входных векторов.

Создайте матрицу 3xN Q из набора выходных векторов.

Умножение матрицы R = P x транспонирование (P)

Вычислить обратную величину R

Умножение матрицы A = Q x транспонирование (P) x инверсия (R)

используя процедуры умножения матриц и обращения матриц из выбранной вами библиотеки линейной алгебры.


Однако матрица аффинного преобразования 3x3 способна масштабировать и поворачивать входные векторы, но не выполнять какое-либо преобразование! Это может быть недостаточно общим для вашей проблемы. Обычно хорошей идеей является добавление «1» в конце каждого из 3-векторов, чтобы затем получить 4-вектор, и искать наилучшую матрицу преобразования 3x4, которая минимизирует ошибку. Это не повредит; это может привести только к лучшему соответствию данных.

person Die in Sente    schedule 15.10.2009
comment
Это тоже отличный ответ, но объяснение было лучше (stackoverflow не подходит для математики) в ссылке, которую я обнаружил в ответе Кены. Итак, Кена получила награду. - person shodanex; 20.10.2009

Некоторой линейной алгебры должно быть достаточно:

Запишите среднюю квадратичную разницу между входными и выходными данными (сумма квадратов каждой разницы между каждым входным и выходным значением). Я предполагаю, что это определение "наилучшего приближения"

Это квадратичная функция ваших 9 неизвестных матричных коэффициентов.

Чтобы минимизировать его, выведите его относительно каждого из них.

Вы получите линейную систему из 9 уравнений, которые вам нужно решить, чтобы получить решение (уникальное или пространственное разнообразие в зависимости от входного набора)

Когда разностная функция не является квадратичной, вы можете сделать то же самое, но вам придется использовать итерационный метод для решения системы уравнений.

person fa.    schedule 13.10.2009
comment
Извините, я думал, вы просили описать математику - person fa.; 13.10.2009