我正在寻找解决以下问题的算法:
我有两组矢量,我想找到最接近从输入矢量到输出矢量的变换的矩阵。
向量是3x1,因此矩阵是3x3。
这是一般性问题。我特别的问题是我有一组RGB颜色,另一组包含所需的颜色。我试图找到一个RGB到RGB的变换,它会让我的颜色更接近你想要的颜色。
输入和输出向量之间存在对应关系,因此计算应该最小化的误差函数是容易的部分。但是我怎样才能最大限度地减少这个功能呢?
答案 0 :(得分:5)
这是一个经典的线性代数问题,搜索的关键词是“多元线性回归”。
多年来,我不得不多次对这种变化进行编码。例如,校准数字转换器平板电脑或触控笔触摸屏的代码使用相同的数学运算。
这是数学:
设 p 为输入向量, q 为相应的输出向量。
您想要的转换是3x3矩阵;称之为 A 。
对于单个输入和输出向量 p 和 q ,存在错误向量 e
e = q - A x p
误差大小的平方是标量值:
e T 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 。 P 的第i列是第i个输入向量。
输出3向量集也是如此;将此矩阵称为 Q 。
当你通过所有代数研磨时,解决方案是
A = Q x P T x( P x P T )^ -1
(其中^ -1是逆运算符 - 抱歉没有上标或下标)
这是算法:
从输入向量集创建3xN矩阵 P 。
从输出向量集中创建3xN矩阵 Q 。
Matrix Multiply R = P x转置( P )
计算 R
的反函数Matrix Multiply A = Q x转置( P )x反向( R )
使用您选择的线性代数库的矩阵乘法和矩阵求逆程序。
然而,3x3仿射变换矩阵能够缩放和旋转输入向量,但不进行任何翻译!这可能不足以解决您的问题。通常最好在每个3向量的末尾附加“1”以生成4向量,并寻找最小化误差的最佳3x4变换矩阵。这不会伤害;它只会导致更好的数据拟合。
答案 1 :(得分:3)
一些线性代数应该足够了:
写入输入和输出之间的平均差值(每个输入和输出值之间每个差值的平方和)。我认为这是“最佳近似”的定义
这是9个未知矩阵系数的二次函数。
为了最大限度地减少它,请根据每一个来推导它。
你将获得一个9个方程的线性系统,你必须解决这个方程才能得到解决方案(根据输入集的独特或空间变化)
当差函数不是二次函数时,你可以这样做,但你必须使用迭代方法来求解方程系统。
答案 2 :(得分:2)
您没有指定语言,但这是我在Matlab中解决问题的方法。
您想要解决系统
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
This为如何解决问题提供了更加与语言无关的解决方案。