モデリング
モデル化の問題として、4 次元空間から 1 次元空間に移動する方法を選択する必要があります。射影関数が必要です: p :- R 4 -> R
射影関数は、問題について持っている知識の一部をマークします。最初のパラメーターが他のパラメーターよりもはるかに重要であることがわかっている場合は、関数p:(x,y,z,t) -> x に進み、他のパラメーターを忘れることができます。一般的に、あなたはこの知識を持っていません。そこで、occam のカミソリ(これは、問題のこのモデリング部分の機械学習の一部です) を使用し、モデルを可能な限り単純に保ちますが、それ以上ではありません。
私は例のために選択します: (1) p : (x,y,z,t) -> x+y+z+t
そのため、サンプルの各パラメーターが同じように結果に寄与します。(2) *p : (x,y,z,t) -> x*y*z*t*
しかし、 (2)の対数変換を使用すると、(1)のようなものが得られます。
選択する学習関数は f(x)->a*x^3+b*x^2+c*x+d です。射影を学習関数に適用する方法に注意する必要があります。モデルに 'p' を適用しても :
f(x,y,z,t) ->
a*(x + y + z + y)^3 +
b*(x + y + z + y)^2 +
c*(x + y + z + y)^1 +
d*(x + y + z + y)^0
しかし :
f(x,y,z,t) ->
a*(x)^3 + b*(x)^2 + c*(x) + d +
a*(y)^3 + b*(y)^2 + c*(y) + d +
a*(z)^3 + b*(z)^2 + c*(z) + d +
a*(t)^3 + b*(t)^2 + c*(t) + d
これは、パラメータの独立性の特性です。各パラメータに学習関数を適用します。各パラメーター間の「+」演算子の選択の一部として既にエンコードされているパラメーターをリンクするという知識。
したがって、パラメーター (a1、b1、c1、d1) の学習問題を解くことは、モデルにとって問題ないはずです。
f(x,y,z,t) ->
a1*(x^3 + y^3 + z^3 + t^3) +
b1*(x^2 + y^2 + z^2 + t^2) +
c1*(x + y + z + t) +
d1
解く
gnuplotを使用すると、この問題はfit 関数(第 7 章)で解決できます。
f(x,y,z,t) = a1*(x**3 + y**3 + z**3 + t**3) + b1*(x**2 + y**2 + z**2 + t**2) + c1*(x + y + z + t) + d1
fit f(x,y,t,u) 'mydata.dat' using 1:2:3:4 via a1, b1, c1, d1
NB1 : fit を使用する場合、変数名 'z' は別のもののために予約されています (help fit)。そのため、'fit' を使用するときは変数の名前を変更する必要があります。
NB2 : mydata.dat にはサンプルが含まれており、各列は表で区切られています。また、サンプルごとに 'y' の既知の値を追加する必要があります。したがって、「mydata.dat」には 5 つの列があります。(ファイル名は「.dat」で終了する必要があります)。
ここに私が使用するmydata.datファイルがあります:
1.5 2.3 4.2 0.9 1.0
1.2 0.3 1.2 0.3 2.0
0.5 1.3 2.2 1.5 3.0
4.2 2.5 3.2 6.2 4.0
ご覧のとおり、各サンプルの期待値を示す「y」列を追加しました。次に、コンソールでツールを実行します。
gnuplot> f(x,y,z,t) = a1*(x**3 + y**3 + z**3 + t**3) + b1*(x**2 + y**2 + z**2 + t**2) + c1*(x + y + z + t) + d1
gnuplot> fit f(x,y,t,u) 'mydata.dat' using 1:2:3:4 via a1, b1, c1, d1
[many lines]
After 9 iterations the fit converged.
final sum of squares of residuals : 8.7617e-31
abs. change during last iteration : -2.9774e-30
Exactly as many data points as there are parameters.
In this degenerate case, all errors are zero by definition.
Final set of parameters
=======================
a1 = 0.340413
b1 = -2.7489
c1 = 6.44678
d1 = -4.86178
それで問題は解決です。
Gnuplot はオープン ソースであるため、自分でコーディングする場合は、ソースを確認することから始めるとよいでしょう。gnuplot で "help fit" から始めることもできます。非線形最小二乗法
(NLLS) の Marquardt-Levenberg アルゴリズムについて話しています。
同等のアルゴリズムの実装には、実際にはこの数学の知識はすべて必要ありません (数学は速度のためにのみ必要です)。あなたがしなければならないのは、最適化された検索基準が学習サンプルでの誤差の最小二乗である検索アルゴリズム(例の遺伝学;バイナリでそれらを書いた後にランダムにパラメータa1-d1を変更する)です。