【问题标题】:finding matrix through optimisation通过优化找到矩阵
【发布时间】:2009-10-17 07:39:11
【问题描述】:

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

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

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

这是一般问题。我的特殊问题是我有一组 RGB 颜色,以及另一组包含所需颜色的颜色。我正在尝试找到一种 RGB 到 RGB 的转换,它可以让我的颜色更接近所需的颜色。

输入和输出向量之间存在对应关系,因此计算应该最小化的误差函数是容易的部分。但是我怎样才能最小化这个功能呢?

【问题讨论】:

  • 两组向量之间是否有对应关系(即集合1,向量1应该映射到集合2,向量1)?
  • 这是某种伽玛校正吗?还是直方图映射?

标签: optimization linear-algebra blas colormatrix


【解决方案1】:

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

多年来,我不得不多次编写这种变体的代码。例如,校准数位板或触控笔触摸屏的代码使用相同的数学运算。


这是数学:

p为输入向量,q为对应的输出向量。

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

对于单个输入输出向量pq,存在误差向量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) = EA(i,j)

的偏导数

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

您的输入 3 向量集是一个 3xN 矩阵;将此矩阵称为 PP的第i列是第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 transpose(P) x inverse (R)

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


然而,3x3 仿射变换矩阵能够缩放和旋转输入向量,但进行任何平移!对于您的问题,这可能不够通用。通常最好在每个 3 向量的末尾附加一个“1”以生成一个 4 向量,并寻找最小化误差的最佳 3x4 变换矩阵。这不会有伤害;它只会更好地拟合数据。

【讨论】:

  • 这也是一个很好的答案,但在我在 Kena 的答案中发现的链接中解释更好(stackoverflow 对数学不好)。所以凯纳得到了赏金。
【解决方案2】:

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

This 提供了一个与语言无关的解决方案。

【讨论】:

  • 那太好了,我正在处理静态数据,所以我可以试试 matlab
  • 由于链接而被接受,这有助于我搜索和发现有关此问题的良好解释。
【解决方案3】:

一些线性代数就足够了:

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

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

要最小化它,请对它们中的每一个进行推导。

您将得到一个线性系统,其中包含 9 个方程,您必须求解才能获得解(唯一的或空间变量,具体取决于输入集)

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

【讨论】:

  • 抱歉,我以为你要的是数学描述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2017-03-27
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多