フリーの数値演算ライブラリ

私のお世話になっている会社が無償で数値演算ライブラリを公開してくれました。

 

数値演算ライブラリ eyemLib

http://www.eyedeal.co.jp/product/eyemLib.html

 

内容的には行列演算(ベクトル演算)、近似計算、幾何計算、計算幾何、キャリパー(寸法計測)向け処理、二次元点群マッチング、カメラキャリブレーション など。

ちょっとキャリパー色が強いかな?

 

これらの関数は、おそらく同社が開発している位置決めライブラリ寸法計測パッケージなどでベースに使っているライブラリと思われ...

 

これらの数値演算に関してはOpenCVでも同じ様な関数はありますが、OpenCVだと無償で商用に使えますが、著作権表示がちょっと抵抗があるな~という人には、ちょうどいいと思います。

ライブラリもスタティックライブラリ(*.lib)なので、ライブラリの使用を完全に隠す事ができます。

 

このライブラリは完全フリーで商用使用可、著作権表示義務なしだそうです。

ただし、使用は自己責任にてノンサポートとなっています。

 

この会社は、画像処理アルゴリズム開発を得意とするスペシャル集団なので、関数もちょっとマニアックな感じ。

近似処理も直線、円、楕円の近似がありますが、それぞれロバスト推定に対応していたり...

個人的には各種行列演算があって、逆行列や固有値、固有ベクトルの関数もあるのは嬉しいかな?

 

関数マニュアルも付いているので、スタティックライブラリを使った事がある人で、それぞれの関数の用途を知っている人には重宝すると思います。

 

数値演算ライブラリ eyemLib

http://www.eyedeal.co.jp/product/eyemLib.html

 

使える数学へ戻る

【参考文献】とんでもなく面白い 仕事に役立つ数学

 

この本はタイトルを見て、すぐに買ってしまいました。

 

 

私自身、学生時代はあまり数学なんて、好きでも無かったし、おそらく大半の人が抱くであろう、こんな勉強して何の役に立つんだろう?と思っていた方なので、仕事で数学が必要になったとき、渋々勉強していたものの、勉強するにつれ、数学を知っていた方が効率良く処理できる事がある事を実感してからは、数学は武器だ!と思うようになり、ちょっとは好きになりました。

 

それもあって、私のブログの中でも 使える数学 として紹介していますが、ほんと、仕事に使える数学は楽しいものです。

 

そんな背景もあり、この本を読みましたが、確かに基本的なコンセプトは強く同感しましたが、

どうも著者は微分 や eiωt が好きらしく、この2つに関連付けて説明している部分が多かったです。

 

その辺はあまり好きではない私にとっては、文章そのものは簡単に書かれているものの、ちょっと難しく感じる部分があったというか、公式の説明になっていて、じゃあ、結局、仕事にどう使うの?と思わせる部分も、ところどころありました。

 

と言っても、自分が思っている数学の素晴らしさ的な物を伝えるのって、結構、難しいように思います。

 

私自身、とってもシンプルに思える事を、他人に説明してみると、結局、公式の説明になっていたりして、これって簡単なんだけどな~と思いながら、うまく伝える事のできないモヤモヤ感が残る事も良くあります。

 

という事で、私にとっては、なんかちょっと微妙な感じでした。

 

ちなみに、私は内積が好きでなので、割と何でも内積にこじつける事で、難しく聞こえる処理も内積と思える事で、簡単い聞こえる場合が度々あります。

 

たとえば、画像処理ではパターンマッチングなんかは、ほとんど内積ですし、フーリエ変換も正規直交規定との内積で、

 

 パターンマッチング ≒ 内積

 フーリエ変換 ≒ 内積

 

と思っています。

って事は

 

 パターンマッチング ≒ フーリエ変換 か??

 

なんて、思えた時には新しい発見ができるかも?しれません。

そういえば、OpenCVのパターンマッチングではフーリエ変換を使って高速化をしているって言ってたし...

 

ちなみに、内積が好きになるきっかけをくれたのは、この本↓

 

 

結構、おすすめです。

 

使える数学へ戻る

【参考書籍】信号処理入門

この本は、知り合いの人から勧められた本なのですが、私も勧めたくなる本でした。

 

画像処理を勉強すると、とりあえずの集大成的なものがフーリエ変換だと思います。

しかし、いきなり公式が出来てきて何だか良く分からないままFFTまでやってみたりと、とても難しいという印象のまま終わってみたりもします。

この本は、そんなもう一度ちゃんとフーリエ変換を理解したいという人にはオススメです。
図が多めで、そんなに難しくは無いと思います。

 

信号処理の概要から始まり、ベクトル→内積→正規直交基底→フーリエ変換→DFT→FFTという流れで説明されています。

この流れがまさにお見事!

フーリエ変換の公式などは本の後半に書いてありますが、いきなり最後の部分を見るのではなく、最初から丁寧に読むと良いと思います。

 

今ではフーリエ変換って正規直交基底との内積でしょ!?

画像処理だと正規化相関も内積、3×3フィルタみたいのも内積、というぐらいの認識でいます。

内積ってサイコ―!!と思えるようになったのも、この本のおかげです。

 

 

目次

1 信号処理とは
1.1 信号処理はどんなとき必要か
1.2 どんな信号があるか
1.3 アナログ信号とディジタル信号
1.4 サンプリング問題
2 信号処理の例
2.1 波形の平滑化
2.2 雑音の圧縮
3 数学の準備体操
3.1 信号処理を学ぶために
3.2 信号の表現
3.3 2次元ベクトルの距離と内積
3.4 正規直交基
3.5 多次元ベクトル空間から関数空間へ
3.6 正規直交関数系
4 相関関数
4.1 関数の類似性を測る
4.2 相互相関関数
4.3 自己相関関数
5 フーリエ級数展開
5.1 フーリエ級数展開とは
5.2 偶関数と奇関数
5.3 周期が2πでない場合
5.4 複素フーリエ級数展開
5.5 パーシバルの定理
5.6 フーリエ級数展開の実例
5.7 フーリエ級数展開の重要な性質
6 DFTとFFT
6.1 ディジタル信号のフーリエ解析
6.2 離散フーリエ変換(DFT)
6.3 DFTの性質
6.4 高速フーリエ変換(FFT)
7 フーリエ変換
7.1 フーリエ級数展開からフーリエ変換へ
7.2 フーリエ変換の性質
7.3 デルタ関数と白色雑音
8 線形システムの解析
8.1 線形システム解析へのアプローチ
8.2 入出力信号の関係
8.3 インパルス応答
8.4 周波数領域でのシステムの表現

 

 

と言っても、フーリエ変換は、あまり使わないな~

 

使える数学へ戻る

 

n点からなる多角形の面積を求める

前回、3点からなる三角形の面積外積を用いて求めました。

これを多角形へ応用したいと思います。

 

まず、外積のおさらいから。

 

Z成分が0(ゼロ)の2つのベクトル

 

 

の外積は

 

 

となり、Z成分の大きさが2つのベクトルのなす平行四辺形の面積となり、三角形の面積はこの半分(1/2)となります。

 

さらに、ベクトルa から ベクトルb への向きが反時計方向の場合
ベクトルa と ベクトルb の外積のZ成分の値はとなり、

 

 

逆に時計方向の場合、Z成分はとなります。

 

 

これを踏まえて、3点からなる三角形の面積を求めるの時は三角形の辺上にベクトルを取りましたが、今回は原点と多角形の頂点の座標とで成すベクトルとします。

 

ここで、多角形の頂点の座標を~Pのように反時計方向に定義します。

ただし、Z座標は0(ゼロ)とします。

 

 

ベクトル→P と ベクトル→P の外積のZ成分の値は時計方向なので、となります。

 

 

同様に、ベクトル→P と ベクトル→P の外積のZ成分の値は反時計方向なので、となります。

 

 

ベクトル→P と ベクトル→P の外積のZ成分の値も反時計方向なので、となります。

 

 

これらの外積の結果のZ成分を足して1/2にすると、求めたい三角形の面積が求まります。

 

 

この事をn点からなる多角形へ応用すると、下図のような図形の場合、

 

 

~Pまでは時計方向となるので、外積のZ成分はとなります。

 

 

~P、Pまでは反時計方向となるので、外積のZ成分はとなります。

 

 

これら全ての外積のZ成分を足し、1/2にすると多角形の面積が求まります。

 

この事を一般式で書くと、頂点の座標をPi (xi,  yi) とすると

 

 

となります。
i は i = 1, 2, 3・・・nのインデックス番号、
|  | は絶対値です。

ただし、i = n のとき、n+1 = 1 とします。

 

また、絶対値を取っているのは、頂点の座標が時計方向へ割り振られた場合にも対応できるようにしています。

 

使える数学へ戻る

 

3点からなる三角形の面積を求める

外積を用いて三角形の面積を求める方法を紹介します。

 

まず、外積のおさらいですが、三次元ベクトルにおいて2つのベクトルの外積の大きさが2つのベクトルからなる平行四辺形の大きさに一致する特徴がありました。

 

この2つのベクトルのZ成分を0(ゼロ)にして二次元座標へ応用します。

2つのベクトルを

 

 

とすると、2つのベクトルの外積は、x成分とy成分は0(ゼロ)となり、z成分の大きさが平行四辺形の面積の大きさとなる事から、3点からなる三角形の面積は平行四辺形の半分の大きさとなり、

 

 

となります。

 

例題

3点、A(1, 3), B(3, 4), A(2, 6)からなる三角形の面積を求めよ。

 

解)

 

使える数学へ戻る

 

平面の方程式

下図のように点(x0, y0, z0を通り、法線ベクトルが

 

 

の平面の方程式は

 

 a(x-x0)+b(y-y0)+c(z-z0)=0

 

となり、一般に

 

 ax+by+cz+d=0

 

と表します。

 

 

 

なぜそうなるのか?というと、平面に垂直な法線ベクトルと、平面上の任意の2点からなるベクトルとは常に垂直である事から、法線ベクトルと、平面上の2点からなるベクトルとの内積の結果は常にとなります。

 

つまり、法線ベクトル(a, b, c)と平面上の2点のベクトル(x-x0, y-y0, z-z0の内積が0となるので、

 

 a(x-x0)+b(y-y0)+c(z-z0)=0

 

となり、これを展開したのが、平面の方程式

 

 ax+by+cz+d=0

 

となります。

 

平面は点が3つあれば求まるのですが、3点から平面の式を求めるには外積を用います。

 

外積では2つのベクトルの外積を求めると、2つのベクトルと外積の結果とは直交するという特徴があるので、下図のように

 

 

平面上の3点P0, P1, P2から、P0→P1P0→P2の2つのベクトルを作り、

 

 (x1-x0, y1-y0, z1-z0

 (x2-x0, y2-y0, z2-z0

 

外積を計算すると、法線ベクトルの各成分(a, b, c)

 

 a=(y1-y0)×(z2-z0)-(y2-y0)×(z1-z0)

 b=(z1-z0)×(x2-x0)-(z2-z0)×(x1-x0)

 c=(x1-x0)×(y2-y0)-(x2-x0)×(y1-y0)

 

となり、法線ベクトルの要素のa, b, cが求まるので、平面の方程式に3点P0, P1, P2のどれかを代入すると平面の方程式が求まります。

 

使える数学へ戻る

 

正規直交基底

正規直交基底はあまり馴染が無いように思いますが、フーリエ変換や主成分分析の理解をするには必要となってきます。

 

【定義】

ベクトルの大きさが1となり、互いのベクトル(任意の2つのベクトル)が
直交するベクトルの組合せ

 

となります。

 

ここで、ベクトルの大きさ(ノルム)がという事は、そのベクトルは単位ベクトルであり、
ベクトルが直交するということは、ベクトルの内積が0となる事を意味しています。

 

もっとも簡単な例として、二次元ベクトルの場合

 

 

上図のように、e1, e2

 

 

としたとき、この e1, e2 は正規直交基底である事は分かると思います。

 

ここで大事なのが、任意ベクトルe1 方向の大きさを, e2 方向の大きさをとすると、

 

各ベクトルの方向の大きさは内積で求まる!

 

という特徴があります。

 

上記の例では

 

e1方向の大きさ

 

a = e1 = X  × 1 + Y × 0= X

 

e2方向の大きさ

 

b = e2 = X  × 0 + Y × 1= Y 

 

となります。この処理を斜影と言います。

 

逆に

 

任意ベクトルは正規直交基底と各大きさを用いて表す事ができる!

 

という特徴もあります。

 

任意ベクトルを求めるには正規直交基底の各ベクトルとその大きさをかけて、ベクトルを足し合わせると求まります。

 

上記の例では

 

  任意ベクトル  = a  × e1 + b × e2
           = a × (1, 0)+ b × (0, 1)
           =  (a, b)

となりますが、この例はあまりにも単純な例なので、もう少しだけ具体的にして、ベクトルを

 

 = (4, 6)

 

正規直交基底を

 

 

とします。

 

 

このとき e1, e2 が正規直交基底であるかどうか?は、それぞれのベクトルの大きさと、内積を計算すると確認する事が出来ます。

 

 

また、このとき、

 

e1方向の大きさ

a = V ・e1 =

 

e2方向の大きさbは

b = V ・e2 =

 

となります。
逆にベクトルVを正規直交基底の e1,e2 とそれぞれの向きの大きさを用いて計算すると

 

 

となり、確かに正規直交基底を用いると任意ベクトルを表すことができそうです。

 

このことをもう少し一般化して、正規直交基底 e1,e2

 

 

としても、任意ベクトル を表すことはできます。

 

 

これをさらに三次元の場合でも、任意ベクトル を表すことができます。

 

 

このノリでさらにn次元の場合でも同様に正規直交基底をe1,e2・・・,eとしても、任意n次元ベクトル を表すことができます。

ということで、クドいですが、正規直交基底には

 

任意ベクトルを正規直交基底と各大きさを用いて表す事ができる!

 

という特徴があります。

 

それって、もうほとんどフーリエ変換の説明になっているのですが、お気づきでしょうか?
フーリエ変換についてはいづれ記事にしたいと思います。

 

外積

外積内積ほどは応用する事は出来ないのですが、外積を用いる事で、平面の向きの計算(ポリゴンの法線ベクトルの計算)や、2つのベクトルのなす平行四辺形の面積の計算、2つのベクトルのなす角度の計算などに応用できます。
2つのベクトルのなす角度については、内積でも計算できますが、外積を使うと、2つのベクトルの位置関係により、角度の値の+、-を使い分けることが可能になります。

 

内積の定義は以下の通りです。

 

三次元空間における2つのベクトル

 

 

において、ベクトルa とベクトルb の外積は、以下のようになります。

 

 

この外積の計算は少し覚えづらいのですが、ベクトルa とベクトルbの成分を上下に並べて、X成分を求める時はX成分を隠して、残りの4つの成分で下図のように斜めに掛けて引く、いわゆるたすき掛けという計算を行います。(と言っておきながら、私は覚えてないので、毎回調べてます...)

 

 

また、内積の計算結果はただの値(スカラー)でしたが、外積の結果はベクトルとなります。

 

ベクトルなので、外積の結果は向きと大きさを持ち、外積の向きは右ねじの方向となります。

(右ねじの回転方向は外積の掛ける順番となります。)

 

さらに外積の大きさ(ノルム)は2つのベクトルでなす平行四辺形の面積と一致します。

 

 

また、2つのベクトルが三次元の場合と言いましたが、二次元のベクトルであってもベクトルのZ成分を0(ゼロ)にする事で外積の特徴を応用する事も可能です。

 

使える数学へ戻る

 

内積

内積は計算そのものは簡単な割にはとても応用範囲が広いので、私の好きな処理の一つなのです。

 

内積の定義は以下の通りです。

 

上図のようにベクトルaとベクトルbの成分を以下のように表すと

 

 

2つのベクトルの内積は

 

 

であらわされます。

 

ただし、ベクトルの大きさは、ノルムと呼ばれ、以下のように計算します。

 

 

さらに一般的にn次元ベクトルの場合、2つのベクトルを

 

a=(a1,a2,a3,・・・,an)

b=(b1,b2,b3,・・・,bn)

 

とすると(添え字の無いは太字で表します)、内積の計算は

 

 

となります。

 

ここまでが、普通に学校で習う内積なのですが、この内積の式をいろいろ変形させて使う事で、応用例が広がります。

 

例えば内積の式を cosθ= の式に変形して

 

 

とすると、定式で求めたcosθのアークコサインを計算すると、2つのベクトルのなす角を求める事ができます。

 

さらにcosθをそのまま用いて、cosθが1の時は2つのベクトルが向きが一致し、cosθが-1の時は2つのベクトルが向きが逆向きとなる事から2つのベクトルの大きさに関係なく、2つのベクトルがどれだけ似ているか?の指標に使われる場合があります。例えば、画像処理では正規化相関が、まさにそのものとなります。

 

また、内積の式を

 

 

のように変形すると、ベクトルbの成分の内、ベクトルaの方向にどれだけの成分があるか?の計算をする事ができます。

 

 

この処理は、いづれ出てくるであろう正規直行規定への斜影の処理と同じです。

 

さらに言うとフーリエ変換の一部とも考える事ができます。

 

と言う事で、内積そのものの計算は同じ成分同士を掛けて足し合わせだけなので簡単なのですが、応用範囲が広いので好きなのです。

 

内積はニュアンス的には、どれだけ似ているか? もしくは 似ている成分を抽出する手法として用いる事ができます。

 

例えば3×3フィルタの一つのソーベルフィルタも、

 

X方向へは

-1 0 1
-2 0 2
-1 0 1

 

Y方向へは

-1 -2 -1
0 0 0
1 2 1

 

と表せれますが、これは一般的には画像を微分している!という捉え方が多いですが、9次元ベクトルの内積を計算している!とも考えられます。

 

そう考えると、ソーベルフィルタの結果は、左から右(上から下)方法へ向かって暗から明へ変化する場合は値が正となり、明から暗へ変化する場合は負となるのも納得できます。

 

さらにエッジの強さが強い時は値が大きくなるのも内積の特性と一致します。

 

と、無理やり内積をこじつける必要もありませんが、正規化相関やフーリエ変換は内積と同じ!と思えると、一見難しそうなアルゴリズムでも、少し簡単に見えてくると思います。
 

使える数学へ戻る

 

ベクトルの引き算

ベクトルaからベクトルbを引く場合、

 

上図のように引く側のベクトルの終点から、引かれる側の終点へ向かうベクトルが引き算の結果となります。

 

といっても覚えづらいので、引く側のベクトルを負にして、向きを逆にし、ベクトルの足し算として捉えた方が覚えやすいと思います。

 

 

ベクトルの成分であらわすと、

 

 

となります。

学校で、このように答えると×をもらうかも?しれませんが、ベクトルは向きと大きさしか持たず、位置の情報は無いので、大人になってから覚えるベクトルの引き算はこれでOKです。

 

使える数学へ戻る

 

ベクトルの足し算

ベクトルaとベクトルbを足す場合、

 

上図のように始点⇒終点⇒始点⇒終点とつなき合わせていき、最初のベクトルの始点から最後のベクトルの終点へ向かうベクトルが足し算の結果となります。

 

 

ベクトルの成分で表すと

 

 

となります。

足す順番を入れ替えても結果は同じです。

 

 

使える数学へ戻る

 

ベクトルの基礎

ベクトルは向き大きさをもった量を表します。

向きが逆の場合、ベクトルは負となります。

 

ベクトルを座標で表すと以下のようになります。

 

ベクトルの大きさは三平方の定理より、以下のようになり、この大きさをノルムと言います。

 

三次元の場合も同様に点P(X,Y,Z)から点P(X,Y,Z)へ向かうベクトルの場合は

 

となり、ノルムも

となります。

 

ここまでは、ベクトルを矢印で表す事のできるベクトルで幾何ベクトルと言います。

 

画像処理においては、より一般的にn個の数の組み合わせからなるn次元ベクトルとして扱う場合があります。

 

表記方法は一般に文字を太字にして

 

 

のように書きます。

 

こうなると、矢印で表す事ができなく、数ベクトルと言います。

 

画像処理的には、例えば、輝度値の平均、最小値、最大値、分散を使った

 

  a=(平均、最小値、最大値、分散)

 

のような4次ベクトル!みたいな扱いをしたりします。(かなりいいかげんな例ですが。)

 

最初はなんでこんな難しそうに聞こえる(頭が良さそうに聞こえる)表現をするんだろうな~と思っていましたが、ベクトルとして扱う事で、内積などのベクトルの演算が使えたり、行列としても扱えたりするので、それなりのメリットも出てきます。

 

使える数学へ戻る

 

奇関数・偶関数の積分

奇関数・偶関数でも説明したように、

関数f(x)が奇関数の場合、-a~aの範囲での積分は

 

関数f(x)が偶関数の場合、-a~aの範囲での積分は

となります。

 

一般的な式では奇関数と偶関数に分けて積分を行います。

(計算例)

となります。

こうする事で計算量を格段に減らす事ができます。

 

現実的には積分の範囲が-a~aになる事はまれで、普通はa~bのような任意範囲で積分する場合が多いかと思います。

そこで、グラフ(関数)全体をabの中心[(a+b) / 2]が原点位置に来るように平行移動を行い、積分範囲が原点に対し対称になるように調整します。

(この処理を行っても積分の結果には影響はありません。)

 

 

こうする事で、一般的な積分においても、奇関数・偶関数の特徴を用いる事が可能となります。

 

なぜ、わざわざそんな事をするかと言うと、積分の部分をfor文に置き換えて関数の合計を計算するプログラムを考えると、この奇関数・偶関数の特徴を用いると計算量が、

 

奇関数の部分で0へ

偶関数の部分で半分に

 

減らせる可能性があるので、トータルで1/4に計算量を減らせるかも?しれないので、その分、処理が高速になります。

 

その例を最小二乗法の最適化で紹介しています。

 

使える数学へ戻る

 

疑似逆行列(一般逆行列)の計算と使用方法

逆行列の計算では行数と列数が等しい正方行列のみ計算が可能でした。
しかし、下記のようにn個の未知数(a1~an)に対して、式がm本 (m>n)ある場合、
逆行列を使って解くことができません。

 

 

上記式を行列であらわすと

 

 

となり、行列部分を記号で書くと

 

・・・式①

 

のようになり行列Xに関して逆行列が求まれば、未知数の行列Aについて解く事が可能となります。

行列Xの行数が列数よりも多い時(未知数よりもデータ数が多い時)、擬似逆行列(一般逆行列ともいう)という物を使って、行列Aに関して近似的に解く事が可能となります。

擬似逆行列は、通常の逆行列転置行列を使って、下記のように現されます。

 

・・・式②

 

この擬似逆行列を使って式①は

 

 

のように未知数を解く事が可能となります。

 

ちなみに、この計算は最小二乗法と同じ結果になるそうです。

という事で、この擬似逆行列を使って、Excelで近似式を求めてみたいと思います。

 

ExcelではXとYのデータのグラフを書くと、近似曲線の追加という機能を使えば簡単に求まります。

でも、この近似式をエクセルの計算を使って求めたいな~という事もあるかと思います。

 

 

そこで、擬似逆行列を使って、データを二次関数で近似する時の例で説明したいと思います。

まず、二次関数の一般式

 

 

を少し変形して

 

 

のようにします。このXとYに近似するm個のデータ(X, Y)を代入し、行列で表すと

 

のようになり、行列の各要素をエクセルで計算します。

 

 

次が少々難しいのですが、エクセルのワークシート関数の

  • 行列の積:mmult
  • 逆行列 :minverse
  • 転置行列:transpose

を使って、疑似逆行列を求めます。

 

今回は未知数が3つなので、縦に3つのセルを選択し、

=MMULT(MMULT(MINVERSE(MMULT(TRANSPOSE(行列Xの範囲),行列Xの範囲)),TRANSPOSE(行列Xの範囲)),行列Yの範囲)

 

のように入力します。

(入力例)

=MMULT(MMULT(MINVERSE(MMULT(TRANSPOSE(B45:D54),B45:D54)),TRANSPOSE(B45:D54)),G45:G54)

 

のように入力し、Ctrl+Shift+Enterキーを同時に押すと、a1~a3が求まり、二次の近似式が求まります。

 

 

このエクセルのファイルはエクセルにより疑似逆行列の計算よりダウンロードできます。

 

エクセルで行列の計算は少し分かりづらいので、【Excel】行列の積、逆行列、転置行列の計算のページも参考にして下さい。

 

今回は二次関数の近似を行いましたが、これさえ知っていれば、未知数が定数で行列で式を表せればいいだけなので、かなり応用が効くと思います。

 

使える数学へ戻る

 

ロバスト推定法(Tukey’s biweight)

ロバストとは?

ロバスト(Robust)という言葉を辞書で調べると、「頑健なさま、がっしりした様子」という意味が載っています。

 

画像処理的には、ノイズや影、明るさの変動などの影響を受けにくく、安定した処理結果が得られる、ぐらいの意味として捉えれば良いでしょう。

 

ロバスト推定法

通常の最小二乗法では下図のように、数点の大きな誤差が含まれるだけでも、近似した直線が大きくズレてしまう場合があります。
この誤差の影響をできるだけ受けないようにしたのが、ロバスト推定法です。

 

処理アルゴリズム

まずは最初に、通常の最小二乗法を行います。
(今回は簡単にするため一次式で近似する例で紹介します。)

 

直線の式(y=ax+b)で近似する場合は以下のように行列を用いて解くことができます。

 

この近似した直線から遠く離れたデータを除去するだけでも、大きな誤差のデータの影響を受けなくなりそうですが、ここでは、誤差の大きさに応じて重みを付けるTukeyのBiweight推定法という手法を紹介します。

 

近似データ(Xi、Yi)と近似直線との誤差 d=Yi – (aXi + b) を用いて、誤差が大きければ大きいほど、
最小二乗に与える影響力(重み)が小さくなるように、以下のような式を用いて重み計算します。

 

d < -Wの場合

-W <= d <= Wの場合

W < dの場合

 

ただし、大文字のは誤差の許容範囲を示します。

 

この重みの関数w(d)をグラフで示すと、このようになります。

 

 

上図を見ても分かるように誤差の絶対値がWを超えると重みが0となり、次に行う重み付き最小二乗法では近似に影響を与えなくなり、逆に誤差が0に近づく程、重みが増し、近似への影響が大きくなります。

 

この重み wi を各近似データ(Xi、Yi)に関して計算し、wiを付加した最小二乗法を再度行います。

 

 

こうして求めた近似式(y = a’X + b’)は最初に求めた近似式よりも、測定データに近づきます。
この処理を誤差の許容範囲()を小さくしながら、誤差が少なくなるまで繰り返すことで、より測定データに近づいた近似式を得ることができます。

 

今回の例では一次式について示していますが、他のn次式などについても、同様に行列の各要素に重みを付加することで、ロバスト推定を行うことができます。

 

参考文献

 

使える数学へ戻る

 

最小二乗法の最適化(高速化)

最小二乗法を用いて曲線近似するとき、近似するX座標の値が等間隔に並んでいる場合、奇関数、偶関数の特性を使って最小二乗法を高速に処理することが可能になります。

 

例えば、画像中の線の中心位置や、エッジの位置をサブピクセル単位で求める場合などに有効です。

 

 

以下からは線の輝度値を2次曲線で近似して、線の中心を求める例を示します。

 

X方向の輝度値が最大となる座標付近の輝度値を抜き出し、2次式で近似すると
X座標が180と181との間に最大値がありそうな事が分かります。

 

 

この輝度値を二次式(Y = aX2 + bX + c)で近似する場合、下記の行列の式を解くと二次式が求まります。

 

 

ここで、逆行列の中は奇関数、偶関数の集まりなので、輝度値データのX座標を中心座標(X = 180.5)で割り振ると

 

 

となります。
よって、奇関数、偶関数の特性から、行列の式は

 

 

となり、行列の計算量を減らすことができます。

 

また、近似するデータの個数が固定できるなら、逆行列の部分はあらかじめ計算しておく事ができるので、さらに計算量を減らすことができます。

 

これで、求める線の中心座標は近似曲線の頂点位置、つまり微分の値が0となる座標(Y’ = 0の座標)なので、

線の中心座標 = Xの中心座標 – b / 2a
(今回の例ではXの中心座標 = 180.5)

 

となり、より高速に線の中心座標を求めることができるようになります。

 

この前提条件とした『X座標の値が等間隔に並んでいる場合』という部分ですが、画像処理においては、画素のX座標、Y座標を用いて、輝度値に関して近似する場合が多いので、for文などで、ある関数の総和などを求める場合には、この奇関数・偶関数が使えないか?検討してみると良いと思います。

 

このテクニックは計算量が格段に少なくなるので、効果的な場合が多いと思います。

 

使える数学へ戻る