3

私は次の問題を解決するためのアルゴリズムを探しています:

2セットのベクトルがあり、入力ベクトルから出力ベクトルへの変換を最もよく近似する行列を見つけたいと思います。

ベクトルは3x1なので、行列は3x3です。

これが一般的な問題です。私の特定の問題は、RGBカラーのセットと、目的のカラーを含む別のセットがあることです。希望の色に近い色が得られるRGBからRGBへの変換を見つけようとしています。

入力ベクトルと出力ベクトルの間には対応関係があるため、最小化する必要のある誤差関数の計算は簡単です。しかし、どうすればこの関数を最小化できますか?

4

3 に答える 3

6

これは古典的な線形代数の問題であり、検索するキーワードは「重回帰」です。

私は何年にもわたってこれのいくつかのバリエーションを何度もコーディングしなければなりませんでした。たとえば、デジタイザータブレットまたはスタイラスのタッチスクリーンを調整するコードは、同じ計算を使用します。


これが数学です:

pを入力ベクトル、q対応する出力ベクトルとします。

必要な変換は3x3行列です。それをAと呼びます。

単一の入力および出力ベクトルpおよびqの場合、エラーベクトルeがあります。

e = q - A x p

エラーの大きさの2乗は、スカラー値です。

e T x e =(q - A x p)T x(q - A x p

(T演算子が転置されている場合)。

本当に最小化したいのは、セット全体のe値の合計です。

E =合計(e

この最小値は、行列方程式D =0を満たします。

D (i、j)= A(i、j)に関するEの偏導関数

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転置(P)x逆行列(R

選択した線形代数ライブラリの行列乗算および行列反転ルーチンを使用します。


ただし、3x3アフィン変換行列は、入力ベクトルをスケーリングおよび回転できますが、変換は実行できません。これはあなたの問題にとって十分に一般的ではないかもしれません。通常、3つのベクトルのそれぞれの最後に「1」を追加して4つのベクトルを作成し、エラーを最小限に抑える最適な3x4変換行列を探すことをお勧めします。これは害にはなりません。それはデータのより良い適合につながるだけです。

于 2009-10-15T17:38:32.963 に答える
3

いくつかの線形代数で十分なはずです:

入力と出力の間の平均二乗差(各入力値と出力値の間の各差の二乗の合計)を書き込みます。これを「最良近似」の定義だと思います

これは、9つの未知の行列係数の2次関数です。

それを最小化するために、それらのそれぞれに関してそれを導き出します。

解を得るために解かなければならない9つの方程式の線形システムが得られます(入力セットに応じて一意または空間の多様性)

差分関数が2次でない場合、同じことを行うことができますが、連立方程式を解くために反復法を使用する必要があります。

于 2009-10-13T11:17:45.980 に答える
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

これにより、問題を解決する方法について、言語に依存しない解決策が得られます。

于 2009-10-15T18:13:49.503 に答える