0

次のようなデータサンプルがあります。

1.5  2.3  4.2  0.9
1.2  0.3  1.2  0.3
0.5  1.3  2.2  1.5
4.2  2.5  3.2  6.2

定義しましょう

x1 = {1.5  2.3  4.2  0.9}

そしてx11 = 1.5、、、(すべての先取特権はサンプルです)x12 = 2.3x13 = 4.2y1 = 0.9


xここで、たとえばfitを使用して、これらのデータに多項式回帰を適用する必要がありますy

x単一変数 (1 次元)のモデルを知っています。

a*x1^3 + b*x1^2 + c*x1 + d = y

私の場合、次のようになります。

a*(x11, x12, x13, x14)^3 + b*(x11, x12, x13, x14)^2 + c*(x11, x12, x13, x14) + d = y

問題は、単一次元であるため、どのように展開するか(x11, x12, x13, x14)^3です。y

4

2 に答える 2

0

モデリング

モデル化の問題として、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を変更する)です。

于 2013-07-19T12:00:32.953 に答える
0

(免責事項: 私は数学者ではなく、その分野の専門家でもありません。 )

ショートバージョン:無理だと思います。

より長いバージョン:

私が理解している限り、あなたはベクトルをべき乗しようとします (例: (x11,x12,x13,x14)^3)。

ベクトルは行列です。ここでは、4 次元のベクトルを4x1行列と見なすことができます。私の知る限り、行列のべき乗は二次行列に対してのみ「許可」されています(nxn)。その理由は、非二次行列では満たされない可換プロパティ( A*B = B*A)です。

あなたが探しているのは、「ベクトル関数の回帰」や「曲面フィッティング」のようなものかもしれません。

それが少し役に立てば幸いです。

*ジョスト

于 2013-07-19T08:20:36.340 に答える