我正在寻找解决以下问题的算法:
我有两组向量,我想找到最接近从输入向量到输出向量的转换的矩阵。
向量是 3x1,所以矩阵是 3x3。
这是普遍的问题。我的特殊问题是我有一组 RGB 颜色,另一组包含所需的颜色。我正在尝试找到一个 RGB 到 RGB 的转换,这将使我的颜色更接近所需的颜色。
输入和输出向量之间存在对应关系,因此计算应该最小化的误差函数是容易的部分。但是我怎样才能最小化这个功能呢?
我正在寻找解决以下问题的算法:
我有两组向量,我想找到最接近从输入向量到输出向量的转换的矩阵。
向量是 3x1,所以矩阵是 3x3。
这是普遍的问题。我的特殊问题是我有一组 RGB 颜色,另一组包含所需的颜色。我正在尝试找到一个 RGB 到 RGB 的转换,这将使我的颜色更接近所需的颜色。
输入和输出向量之间存在对应关系,因此计算应该最小化的误差函数是容易的部分。但是我怎样才能最小化这个功能呢?
这是一个经典的线性代数问题,要搜索的关键词是“多元线性回归”。
多年来,我不得不多次编写这种变体。例如,校准数位板或触控笔触摸屏的代码使用相同的数学运算。
这是数学:
设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。
矩阵乘法 R = P x 转置 ( P )
计算R的逆
矩阵乘法A = Q x transpose( P ) x inverse ( R )
使用您选择的线性代数库的矩阵乘法和矩阵求逆例程。
但是,3x3 仿射变换矩阵能够缩放和旋转输入向量,但不能进行任何平移!对于您的问题,这可能不够通用。通常最好在每个 3 向量的末尾附加一个“1”以生成一个 4 向量,并寻找最小化误差的最佳 3x4 变换矩阵。这不会有伤害;它只能导致更好地拟合数据。
您没有指定语言,但这是我在 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
这为如何解决问题提供了一个与语言无关的解决方案。
一些线性代数就足够了:
写出输入和输出之间的平均平方差(每个输入和输出值之间每个差的平方和)。我认为这是“最佳近似值”的定义
这是 9 个未知矩阵系数的二次函数。
为了最小化它,请对它们中的每一个进行推导。
您将获得一个线性系统,其中包含 9 个方程,您必须求解才能获得解(唯一的或空间变化取决于输入集)
当差分函数不是二次的时,您可以这样做,但您必须使用迭代方法来求解方程组。