はじめに
本アルゴリズムは、何か文献を参考にしたものではないので、間違っている可能性があります。予めご了承ください。
要件
点列 にフィットする3次ベジェ曲線を見つけたいとします。
点列の数 は4以上であるとします。(後で2以上でも導出可能なアイデアを下に書いております。)
3次ベジェ曲線の制御点を とします。
求める3次ベジェ曲線の端点 はそれぞれ点列の始点 と終点 に一致するとします。
3次ベジェ曲線上の点を とおくと以下のようになります。
はすでに求まっているので、 を求めれば、3次ベジェ曲線が定まることになります。
最小二乗法で解く
一般的に3次ベジェ曲線と点の距離を計算するのは大変なので、点に対応する3次ベジェ曲線のパラメータの値を計算します。
隣り合う点との距離の和の比を3次ベジェ曲線のパラメータの値とします。
点列と3次ベジェ曲線との距離の2乗の和 を計算します。
式 で とおきました。
ここで の 第 成分をそれぞれ と書くことにします。
式 で はノルムの2乗なので、各成分の2乗の和となっています。
ここでわざわざ という関数の和にしたのは、この後に で偏微分するのですが、
その時成分が異なる項は0になるためです。
を整理します。
を計算します。
を計算します。
これでやっと を偏微分する準備ができました。
解き方の基本方針としては、各成分ごとに方程式を解いて、値を求めていきます。
を計算します。
式 を式 に代入します。
を計算します。
式 を式 に代入します。
後は、式 の連立方程式を解くだけです。
ここで、 のときは、それぞれ であり、このとき なので、式 の和は から まででよいことが分かります。
式 を行列を使って書きます。
始点終点を除くデータが全て一致しなければ、式 の逆行列は存在します。(下でもう少し詳しく説明します。)
式 より、 が求まりました。
これを全成分求めれば、 が求まります。
お疲れさまでした。
点列を増やす
このアルゴリズムで点列の数が少ない場合、点列にフィットしすぎて(過学習)あまりよくありません。
下図は、データ数が4つの場合。
また、データ点が3個の時もどうにか3次ベジェ曲線を求めたいです。
そこで、データを増やすことにします。
点列の間に新たに点を作成する(隣り合う点の中点)ことにより、点列を水増しします。
点列がN個なら2N-1個になります。
下図は、データ数4つを7つに増やした場合。上図と比べて、ややいい感じになっています。
※この点列を増やすロジックは私の好みもありますので、自身の好みに応じて変更してください。
式(16)の逆行列が存在する理由
式 の逆行列を求めるときに必要な行列式は、 であり、コーシーシュワルツの不等式を適用すると、以下の式が成り立ちます。
式 の等号が成り立たなければ、行列式が となり、逆行列が存在するわけです。
式 の等号が成り立つのは、 のときです。()
ここで、 を計算してみます。
横軸が で、縦軸が のグラフ。
は式 による定義より、同一点が連続しなければ です。
加えて、式 は単射なので、式 の等号が成り立つのは、始点と終点を除いたデータが全て一致するときのみであることが分かります。
そのような不正なデータは本アルゴリズムを適用する前に避ければよいので、特に問題にはなりません。
よって、式 の逆行列は(よっぽど変なデータでない限り)存在します。
成分ごとに解を求める理由
求めるベクトル で をまとめて偏微分すれば、いいんじゃないのか?と思っている人がいるかもしれません。
はい、それでも勿論解が求まります。
実際に の場合、すなわち、 の場合で計算をしてみます。
ここで、 とおきます。
と置きます。
式 の行列を見てもらえばわかる通り、無関係な成分の行列の要素が になっているので、式 のように変形できます。
ですので、各成分ごとに解を求めることにしたわけです。
式 の は特に意味はありません。
少しでも早く動かす
は を求めた時点で計算可能なので、
事前に計算しておくと、少し計算時間が短くなります。
パラメータについて少し考察
を のノルムで計算してますが、各成分ごとに を求め、それを使って距離を計算するのもありかもしれません。