プログラムな日常>ウェブプログラム作品集>
多項式近似
(get the factorized set of functions closest to given points)
max_polynom_dim ( + 1 = number of parameters)
graph
text

使い方:
解説:

関数のフィッティングを考えます。
    
がまずあるとします。これは数学的なものであっても、自然または社会科学的な実体であっても良く、x はスカラーであってもベクトルであっても良いです。この I 個の条件
    
に対する値
    
が得られているとします。(たまたまかも知れないけれど)ここに得られているデータを最大限尊重してフィッティングします。すなわち、合成した関数
    
が、指定された I 個の点について、知られている に近づくようにします。最大限尊重という意味は、誤差の二乗和
    
を最小にすることです。また、このですが、一定の条件のものに動かします。この条件とは、一般には J 個の変数
    
だけで制御することであり、この仕方は本来制限はなく、例えば、カーブを横にシフトするといったことでも良いのですが、 普通はそうせず、次のように関数セットの一次結合として展開します。


【線形の最小二乗法】

    
ここで、J 個の関数
    
の選び方は全く任意です。x に関する多項式であっても、三角関数であっても、指数関数他、任意の関数で OK です。 関数系を選ぶ時にしばしば気を遣うような、直交系という必要もありません。 極端な話、 は、連続関数である必要もありません。 ですが、固定された x に対する は、
    
による線形関係で決まるのです。この場合を、線形な最小二乗法と言います。 最小二乗法は線形で行わなければいけないわけではありませんが、そうすることが有利であり、 それでこそ代数的にを決められ、反復解法が要らなくなります。 くどいようですが、ここで言う「線形」の意味は、の個々の性質に関することではありません。 ページのタイトルは「多項式近似」としましたが、個々の「項」の係数を除く実体、すなわち は x の累乗だけとは限らず、多様な関数が可能です。
係数を求める手法ですが、
    
と置いて配列 A を作り、 からベクトル b、 からベクトル g、 からベクトル f を作ると、
    
    
    
この u を、b の選択により最小化するのが課題となります。


【代数化された(線形の)最小二乗法の解法】

ここからは、行列のサイズと、行列内の各エリアをイメージできるような表現をしています。同じ色のものは同じサイズです(縦横が入れ替わることはあります)。 ベクトルには小文字を使っており、T は転置行列を意味します(肩に乗っているものと見做して下さい)。
    
( d)
= (A f)
()
b
-1


    
u = ()
dT
( d)
最小二乗法では u の最小値を求めるわけだが、各要素は実数とすると u が非負なのは二乗の和だから明らかである。ここで先の d を代入すると、
    
u = ()
bT -1
()
AT
fT
(A f)
()
b
-1
     
= ()
bT -1
()
AT A AT f
fT A fT f
()
b
-1
真ん中の因子は対称行列であって、これは二次形式である。そこで、
     
()
h
= ()
AT A AT f
fT A fT b
()
b
-1
と書くと、ベクトル h の最後の1個を除く各要素は、b の要素との積が u を作るから、u の極値においてはゼロでなくてはいけないことは、 前回ご説明した通りである。だとすると、最後の行を除く関係式は、
     
()
0
= ()
AT A AT f
(b )
-1
従って、
     
(AT A )
(b )
= (AT f )
     
( ) =
b
() -1
AT A
( )
AT
(f )
最後の式の右辺で f に掛かっている全体は、以前ご説明した、A の「一般逆行列」になっている。


【本ページのソフトについて】
特定の x 値に対する関数セットの各値としてベクトルを与えるルーチンが下記のものであり、この場合は x の累乗列を返しているわけだが、 基本的にはこの部分だけ書き換えれば、他の関数系にも問題なく対応する。
ソフトが表示している index は、目的の曲線に対して、十分な情報が与えられているかどうかを判定する指標である。 n 次の曲線を描こうとすると n+1 個の点が必要だが、この内の複数個の x 座標が一致するような場合、点の情報が必要に対して不足することになる。 この場合は index がゼロになるから、その場合は次数を落として描画している。
今回の index の定義には、横ベクトル [xi, 1] を縦に並べた2列のマトリクス C を利用しており、
    
としている。このように、以前にご説明した「絶対行列式」を役立てているが、 行列式の値の桁が条件によって大きく変わるのをキャンセルするため、凝った定義になった。


【利用価値】

今回、高次のフィッティングを行ったが、これ自体はグラフを描くといった利用に限られるかも知れない。
重要度が高いのは、極小や極大の近傍の分析である。 そのためにおこなったサンプリングが適切かどうかは、1次元ならば問題とする点の前後をあまり間を空けずにサンプリングされていることだけを見れば足りるが、2次元以上の評価では、指標はさらに重要になると思う。