намиране на матрица чрез оптимизация

Търся алгоритъм за решаване на следния проблем:

Имам два комплекта вектори и искам да намеря матрицата, която най-добре приближава трансформацията от входните вектори към изходните вектори.

векторите са 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
Това би било страхотно, работя върху статични данни, така че мога да пробвам matlab - person shodanex; 15.10.2009
comment
Прието поради връзката, която ми помогна да търся и открия добро обяснение за този проблем. - person shodanex; 20.10.2009

Това е класическа задача на линейната алгебра, ключовата фраза за търсене е "множествена линейна регресия".

Трябваше да кодирам някои варианти на това много пъти през годините. Например кодът за калибриране на таблет с дигитайзер или сензорен екран със стилус използва същата математика.


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

Нека p е входен вектор и q съответният изходен вектор.

Трансформацията, която искате, е матрица 3x3; наречете гоА.

За един входен и изходен вектор 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 не е чудесно за математика) във връзката, която открих в отговора на Kena. Така Кена получи наградата. - person shodanex; 20.10.2009

Малко линейна алгебра трябва да е достатъчна:

Напишете средната квадратна разлика между входове и изходи (сумата от квадратите на всяка разлика между всяка входна и изходна стойност). Приемам това като определение на "най-доброто приблизително"

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

За да го минимизирате, изведете го по отношение на всеки от тях.

Ще получите линейна система от 9 уравнения, които трябва да решите, за да получите решението (уникално или пространствено разнообразие в зависимост от входния набор)

Когато функцията на разликата не е квадратна, можете да направите същото, но трябва да използвате итеративен метод за решаване на системата от уравнения.

person fa.    schedule 13.10.2009
comment
Съжалявам, мислех, че сте поискали описание на математиката - person fa.; 13.10.2009