Optimization 通过优化寻找矩阵

Optimization 通过优化寻找矩阵,optimization,linear-algebra,blas,colormatrix,Optimization,Linear Algebra,Blas,Colormatrix,我正在寻找解决以下问题的算法: 我有两组向量,我想找到最接近从输入向量到输出向量的变换的矩阵 向量是3x1,所以矩阵是3x3 这是一个普遍的问题。我的特殊问题是我有一组RGB颜色,另一组包含所需的颜色。我试图找到一个RGB到RGB的转换,使我的颜色更接近理想的 输入和输出向量之间存在对应关系,因此计算应最小化的误差函数是容易的部分。但如何最小化此函数?一些线性代数就足够了: 写下输入和输出之间的平均平方差(每个输入和输出值之间每个差的平方和)。我假设这是“最佳近似”的定义 这是9个未知矩阵系数的

我正在寻找解决以下问题的算法:

我有两组向量,我想找到最接近从输入向量到输出向量的变换的矩阵

向量是3x1,所以矩阵是3x3

这是一个普遍的问题。我的特殊问题是我有一组RGB颜色,另一组包含所需的颜色。我试图找到一个RGB到RGB的转换,使我的颜色更接近理想的


输入和输出向量之间存在对应关系,因此计算应最小化的误差函数是容易的部分。但如何最小化此函数?

一些线性代数就足够了:

写下输入和输出之间的平均平方差(每个输入和输出值之间每个差的平方和)。我假设这是“最佳近似”的定义

这是9个未知矩阵系数的二次函数

要最小化它,请针对它们中的每一个导出它

你将得到一个由9个方程组成的线性系统,你必须求解才能得到解(唯一或空间变化,取决于输入集)


当差分函数不是二次函数时,也可以这样做,但必须使用迭代方法来求解方程组。

这是一个经典的线性代数问题,需要搜索的关键短语是“多元线性回归”

这些年来,我已经多次编写了这方面的一些变体。例如,校准数字化仪平板电脑或手写笔触摸屏的代码使用相同的数学公式


以下是数学:

p为输入向量,q为相应的输出向量

您想要的变换是一个3x3矩阵;称之为A

对于单个输入和输出向量pq,存在一个错误向量e

e=q-Axp

误差大小的平方是一个标量值:

eT xe=(q-Axp)T x(q-A

(其中T运算符为转置)

您真正想要最小化的是集合上e值的总和:

E=总和(E

该最小值满足矩阵方程D=0,其中

D(i,j)=EA(i,j)的偏导数

假设有N个输入和输出向量

您的输入3向量集是一个3xN矩阵;将此矩阵称为PP的第i列是第i个输入向量

输出3矢量的集合也是如此;将此矩阵称为Q

当你钻研所有的代数时,答案是

A=QxpTX(pxpT)^-1

(其中^-1是逆运算符——很抱歉没有上标或下标)


以下是算法:

从输入向量集创建3xN矩阵p

从输出向量集创建3xN矩阵Q

矩阵乘法R=px转置(p

计算逆fR

矩阵乘法A=Qx转置(p)x逆(R

使用所选线性代数库的矩阵乘法和矩阵求逆例程



然而,3x3仿射变换矩阵能够缩放和旋转输入向量,但进行任何转换!对于您的问题,这可能不够一般。通常最好在3个向量的末尾加上一个“1”,然后再加上一个4个向量,然后寻找使误差最小化的最佳3x4变换矩阵。这不要紧;这只会导致数据的更好拟合。

您没有指定语言,但下面是我如何在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

就如何解决该问题给出了一个更具语言无关性的解决方案。

两个集合中的向量之间是否存在对应关系(即集合1,向量1是否应该映射到集合2,向量1)?这是某种伽马校正吗?或者直方图映射?对不起,我以为你要的是一个数学描述,这很好,我正在处理静态数据,所以我可以在matlabAccepted上试一试,因为链接帮助我搜索并发现关于这个问题的好解释。这也是一个很好的答案,但解释更好(stackoverflow对数学不太好)在我在Kena的答案中发现的链接中,Kena得到了赏金。