質問

次の問題を解決するアルゴリズムを探しています。

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

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

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

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

役に立ちましたか?

解決

言語は指定しませんが、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

これ 問題を解決する方法について、より言語に依存しないソリューションを提供します。

他のヒント

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

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


計算は次のとおりです。

させて p 入力ベクトルであり、 q 対応する出力ベクトル。

必要な変換は 3x3 行列です。あれを呼べ .

単一の入力および出力ベクトルの場合 p そして q, 、誤差ベクトルがあります e

e = q - バツ p

誤差の大きさの 2 乗はスカラー値です。

ee = (q - バツ p)T×(q - バツ p)

(T 演算子は転置です)。

本当に最小化したいのは、次の合計です。 e セットに対する値:

E = 合計 (e)

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

D(i,j) = の偏導関数 E に関して (i,j)

N 個の入力ベクトルと出力ベクトルがあるとします。

入力 3 ベクトルのセットは 3xN 行列です。この行列を呼び出します P。の i 番目の列 P は i 番目の入力ベクトルです。

出力 3 ベクトルのセットも同様です。この行列を呼び出します Q.

代数をすべて徹底的に調べてみると、解決策は次のようになります。

= Q バツ PT×(P バツ PT) ^-1

(^-1 は逆演算子です -- 上付き文字や下付き文字がないことをお詫びします)


アルゴリズムは次のとおりです。

3xN 行列を作成する P 入力ベクトルのセットから。

3xN 行列を作成する Q 出力ベクトルのセットから。

行列乗算 R = P x 転置 (P)

逆数を計算する R

行列乗算 = Q x 転置(P) x 逆数 (R)

選択した線形代数ライブラリの行列乗算ルーチンと行列逆行列ルーチンを使用します。


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

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

の入力と出力との間の平均二乗差(各入力と出力値との各差分の二乗和)を書きます。私は

「最高の概算」の定義としてこれを前提とし

これはあなたの9つの、未知の行列係数の二次関数である。

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

あなたは(一意または入力セットに応じてスペース品種)ソリューションを取得するために解決しなければならない9つの方程式の線形システムを取得します。

差関数が二次でない場合は、

、あなたが同じことを行うことができますが、方程式系を解くために反復法を使用する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top