非線形最小二乗近似の初期値を選択する方法


12

上記の質問はそれをすべて言っています。基本的に私の質問は、推定しようとしているパラメータが非線形になる一般的なフィット関数(任意に複雑になる可能性があります)に関するものです。フィットを初期化するために初期値をどのように選択しますか?非線形最小二乗を実行しようとしています。戦略や方法はありますか?これは研究されましたか?参照はありますか?アドホックな推測以外に何かありますか?具体的には、現在作業しているフィッティング形式の1つは、推定しようとしている5つのパラメーターを持つガウスプラス線形形式です。

y=Ae(xBC)2+Dx+E

ここで、x=log10(横座標データ)およびy=log10(縦座標データ)は、log-log空間では、データが直線とガウスで近似するバンプのように見えることを意味します。線の傾斜やバンプの中心/幅などのグラフ化と眼球運動を除いて、非線形フィットを初期化する方法については何の理論もありません。しかし、グラフ化や推測の代わりに、これを行うためのこれらの当てはめが100以上ありますが、自動化できるアプローチを好むでしょう。

ライブラリまたはオンラインで参照が見つかりません。私が考えることができる唯一のものは、初期値をランダムに選択することです。MATLABは、均一に分布した[0,1]からランダムに値を選択することを提案しています。したがって、各データセットで、ランダムに初期化されたフィットを1000回実行してから、r 2が最も高いものを選択しますr2ますか?他の(より良い)アイデアはありますか?


補遺#1

まず、データセットの視覚的な表現をいくつか示します。これは、私が話しているデータの種類を示すためのものです。変換を行わずに元の形式でデータを投稿し、データの機能の一部を明確にし、他の機能をゆがめながら、ログとログの空間に視覚的に表示します。良いデータと悪いデータの両方のサンプルを投稿しています。

良いデータ ログとログの良好なデータ 不良データ 不良データをログに記録

各図の6つのパネルにはそれぞれ、赤、緑、青、シアンの4つのデータセットがプロットされており、各データセットには正確に20個のデータポイントがあります。私は、データに見られるバンプのために、それらのそれぞれに直線とガウスを合わせようとしています。

最初の図は、良いデータの一部です。2番目の図は、図1と同じ良好なデータの対数プロットです。3番目の図は、不良データの一部です。4番目の図は、図3の対数プロットです。はるかに多くのデータがあり、これらは2つのサブセットにすぎません。ほとんどのデータ(約3/4)は良好であり、ここで示した良好なデータと同様です。

いくつかコメントがあります。これは長くなる可能性がありますが、この詳細はすべて必要だと思います。できるだけ簡潔にしようと思います。

私はもともと単純なべき法則(対数空間の直線を意味する)を期待していました。log-logスペースにすべてをプロットすると、約4.8 mHzで予期しないバンプが見られました。バンプは徹底的に調査され、他の作品でも発見されたので、混乱したわけではありません。それは物理的にそこにあり、他の出版された作品もこれに言及しています。そこで、線形形式にガウス項を追加しました。この適合は、ログとログのスペースで行われることに注意してください(この質問を含む私の2つの質問)。

今、Stumpy Joe Peteによる私の別の質問(これらのデータとはまったく関係ない)への答えを読んで、これこれとその中の参照(Clausetのもの)を読んだ後、私はlog-logに収まるべきではないことに気付きましたスペース。だから今、私は事前に変換された空間ですべてをやりたい。

質問1:良いデータを見ると、変換前の空間で線形プラスガウス分布がまだ良い形だと思います。私は、彼らが考えていることをより多くのデータ経験がある他の人から聞いてみたいです。ガウス+線形は妥当ですか?ガウス分布のみを行うべきですか?または完全に異なる形式ですか?

質問2:質問1の答えが何であれ、私はまだ(おそらく)非線形最小二乗近似が必要なので、初期化の支援が必要です。

2つのセットが表示されるデータでは、最初のバンプを約4〜5 mHzでキャプチャすることを非常に強く好みます。したがって、ガウス項を追加したくはありません。ガウス項は最初のバンプを中心にする必要があります。これはほとんどの場合、より大きなバンプです。0.8mHz〜5mHzの間で「より高い精度」が必要です。高い周波数についてはあまり気にしませんが、それらを完全に無視したくはありません。それで、おそらくある種の計量ですか?または、Bは常に4.8mHz前後で初期化できますか?

fL

L=Ae(fBC)2+Df+E.
  • f
  • L
  • AA>0A
  • B
  • CCC
  • D
  • ELELf=0

Ae(B/C)2+E.

EEf=0

L

質問3:この場合、この方法を外挿するとどう思いますか?賛否両論ありますか?外挿のための他のアイデアはありますか?繰り返しますが、低周波数のみに注意を払うので、0〜1mHzの間で外挿することがあります。非常に小さい周波数で、ゼロに近い場合もあります。この投稿は既に満員です。答えが関連している可能性があるため、ここでこの質問をしましたが、皆さんが希望する場合は、この質問を分けて後で質問することができます。

最後に、リクエストに応じて2つのサンプルデータセットを示します。

0.813010000000000   0.091178000000000   0.012728000000000
1.626000000000000   0.103120000000000   0.019204000000000
2.439000000000000   0.114060000000000   0.063494000000000
3.252000000000000   0.123130000000000   0.071107000000000
4.065000000000000   0.128540000000000   0.073293000000000
4.878000000000000   0.137040000000000   0.074329000000000
5.691100000000000   0.124660000000000   0.071992000000000
6.504099999999999   0.104480000000000   0.071463000000000
7.317100000000000   0.088040000000000   0.070336000000000
8.130099999999999   0.080532000000000   0.036453000000000
8.943100000000001   0.070902000000000   0.024649000000000
9.756100000000000   0.061444000000000   0.024397000000000
10.569000000000001   0.056583000000000   0.025222000000000
11.382000000000000   0.052836000000000   0.024576000000000
12.194999999999999   0.048727000000000   0.026598000000000
13.008000000000001   0.045870000000000   0.029321000000000
13.821000000000000   0.041454000000000   0.067300000000000
14.633999999999999   0.039596000000000   0.081800000000000
15.447000000000001   0.038365000000000   0.076443000000000
16.260000000000002   0.036425000000000   0.075912000000000

最初の列はmHz単位の周波数で、すべての単一データセットで同一です。2番目の列は適切なデータセット(良好なデータ図1と2、パネル5、赤いマーカー)で、3番目の列は不正なデータセット(不良データ図3と4、パネル5、赤いマーカー)です。

これが、より啓発的な議論を刺激するのに十分であることを願っています。みなさんありがとう。


追加情報については+1ですが、これは新しい質問のように見えます。ちなみに、以前のものを今すぐ削除したい場合、それは大丈夫だと思います、それはあなたが今持っていた追加情報をカバーしているように見えます。
Glen_b -Reinstateモニカ

@Glen_bなぜそうなのですか?なぜ新しい質問のように見えるのですか?古い質問については、私たち全員がポイントを求めています;-Dと古いものには2つのアップ投票がありますが、これとマージする方法はありますか?
固定小数点

まず第一に、あなたは今、前と同じように何に合うかを指定するのではなく、何に合うべきかを尋ねています。他にも多くの違いがありますが、そのうちのいくつかはかなり重要だと思います。私は私の答えを変えることを検討しますが、これは元の質問と回答として成り立ち、他のことを求めているあなたの新しい部分は新しいものになる可能性があると思います。現時点ではあなたの判断に任せます。
Glen_b -Reinstateモニカ

@Glen_b結構です、余分な質問を消しました。したがって、質問はまだあります。線形+ガウス形式を使用してフィットしたいデータがいくつかありますが、ランダム初期化よりも良いでしょうか?
固定小数点

私の現在の答えは、少なくともいくつかの状況では、あなたはより良いことができることを示していると思います。@ whuberは、私のプロセスよりもさらに簡単なものを提案します。戻ってあなたのデータで私がどのように実行するかを見ることができましたが、今でもそれはそのような出発点を設定する方法をいくつか提供します。
Glen_b

回答:


10

た戦略があった場合は、両方の良い一般的な -それは、すでにすべての非線形最小二乗プログラムで実装されるだろうと値を起動すると、非の問題だろう-常に働いていた1。

多くの特定の問題または問題のファミリーに対して、開始値へのかなり良いアプローチがいくつかあります。一部のパッケージには、特定の非線形モデルに適した開始値の計算が含まれているか、より効果的な一般的なアプローチが含まれていますが、より具体的な機能や開始値の直接入力が必要になる場合があります。

状況によってはスペースを探索する必要がありますが、より具体的な戦略が価値があるような状況になる可能性が高いと思いますが、良い戦略を設計するためには、私たちが所有する可能性が低い多くのドメイン知識が必要です。

x

yx

A

いくつかのサンプルデータが役立ちます-可能であれば、典型的な場合と難しい場合です。


編集:問題があまりうるさくない場合、あなたがかなりうまくできる方法の例を次に示します:

モデルから生成されるデータを次に示します(母集団の値はA = 1.9947、B = 10、C = 2.828、D = 0.09、E = 5です):

nlsデータ

推定できた開始値は次の
とおりです(As = 1.658、Bs = 10.001、Cs = 3.053、Ds = 0.0881、Es = 5.026)

その開始モデルの適合は次のようになります。

nlstart

手順は次のとおりです。

  1. Theil回帰を近似して、DとEの大まかな推定値を取得します
  2. Theil回帰の近似を差し引く
  3. LOESSを使用して滑らかな曲線に適合させる
  4. Aの大まかな推定値を得るためにピークを見つけ、Bの大まかな推定値を得るためにピークに対応するx値
  5. y値がAの推定値の60%を超えるLOESS近似を観測として取得し、2次近似
  6. 二次関数を使用してBの推定値を更新し、Cを推定します
  7. 元のデータから、ガウスの推定値を減算します
  8. 別のTheil回帰を調整されたデータに当てはめて、DおよびEの推定値を更新します

この場合、値は非線形フィットの開始に非常に適しています。

これをRコードとして作成しましたが、MATLABでも同じことができます。

これよりも良いことが可能だと思います。

データのノイズが多い場合、これはまったく機能しません。


編集2:これは私がRで使用したコードです、誰かが興味を持っている場合:

gausslin.start <- function(x,y) {

  theilreg <- function(x,y){
    yy <- outer(y, y, "-")
    xx <- outer(x, x, "-")
    z  <- yy / xx
    slope     <- median(z[lower.tri(z)])
    intercept <- median(y - slope * x)
    cbind(intercept=intercept,slope=slope)
  }

  tr <- theilreg(x,y1)
  abline(tr,col=4)
  Ds = tr[2]
  Es = tr[1]
  yf  <- y1-Ds*x-Es
  yfl <- loess(yf~x,span=.5)

  # assumes there are enough points that the maximum there is 'close enough' to 
  #  the true maximum

  yflf   <- yfl$fitted    
  locmax <- yflf==max(yflf)
  Bs     <- x[locmax]
  As     <- yflf[locmax]

  qs     <- yflf>.6*As
  ys     <- yfl$fitted[qs]
  xs     <- x[qs]-Bs
  lf     <- lm(ys~xs+I(xs^2))
  bets   <- lf$coefficients
  Bso    <- Bs
  Bs     <-  Bso-bets[2]/bets[3]/2
  Cs     <- sqrt(-1/bets[3])
  ystart <- As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es

  y1a <- y1-As*exp(-((x-Bs)/Cs)^2)
  tr  <- theilreg(x,y1a)
  Ds  <- tr[2]
  Es  <- tr[1]
  res <- data.frame(As=As, Bs=Bs, Cs=Cs, Ds=Ds, Es=Es)
  res
}

# population parameters: A = 1.9947 , B = 10, C = 2.828, D = 0.09, E = 5
# generate some data
set.seed(seed=3424921)
x  <- runif(50,1,30)
y  <- dnorm(x,10,2)*10+rnorm(50,0,.2)
y1 <- y+5+x*.09 # This is the data
xo <- order(x)

starts <- gausslin.start(x,y1)
ystart <- with(starts, As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es)
plot(x,y1)
lines(x[xo],ystart[xo],col=2)

3
+1。フィットを数千回繰り返して、最良のものを選択すると(正しく理解できれば)奇妙な考えに聞こえます。モデルがデータに対して適切であり、適切な初期値がある場合、非線形最小二乗は収束するはずです。当然、2番目はあなたが尋ねているものです。しかし、各近似に対して異なる開始値を選択する必要があるかもしれないことを暗示するのは悲観的です。
ニックコックス

1
@NickCoxそれは遭遇する問題の範囲に帰着します-以前の投稿から思い出すと、OPはこれらの問題の膨大な数を取得しますが、以前に良い提案をするのに十分な詳細を見たことを思い出しませんでした潜在的なアプローチを試す時間(投稿するのに十分な決定的なものは得られませんでした)。OPには、ほぼ常に自分の問題を解決する適切な開始値を生成できるようなドメイン知識があります。
Glen_b-モニカの復職


3
|A|BA>0CA1/4A>0A<0

2
BB

6

これらの種類の非線形モデルを適合させる一般的なアプローチがあります。それは、最初の、最後の周波数値での従属変数の値と、中央の6番目の点での良い点で線形パラメーターを再パラメーター化することを伴います。次に、これらのパラメーターを固定して、最小化の最初のフェーズで非線形パラメーターを解き、全体で5つのパラメーターを最小化できます。

シュヌートと私は、魚の成長モデルを適合させるときに1982年頃にこのことを理解しました。

http://www.nrcresearchpress.com/doi/abs/10.1139/f80-172

ただし、このペーパーを読む必要はありません。パラメーターが線形であるという事実により、モデルの安定したパラメーター化を使用するには、3x3の連立方程式を設定して解くだけで済みます。

モデルの場合、線形部分は行列によって決定されますM

M=(exp(((x(1)B)/C)2)x(1)1exp(((x(6)B)/C)2)x(6)1exp(((x(n)B)/C)2)x(n)1)
n=20
DATA_SECTION
  init_int n
  int mid
 !! mid=6;
  init_matrix data(1,n,1,3)
  vector x(1,n)
  vector y(1,n)
 !! x=column(data,1);
 !! y=column(data,3);   //use column 3
PARAMETER_SECTION
  init_number L1(3)     //(3) means estimate in phase 3
  init_number Lmid(3)
  init_number Ln(3)

  vector L(1,3)
  init_number log_B       // estimate in phase 1
  init_number log_C(2)    // estimate in phase 2 
  matrix M(1,3,1,3);
  objective_function_value f
  sdreport_vector P(1,3)
  sdreport_number B
  sdreport_number C
  vector pred(1,n);
PROCEDURE_SECTION
  L(1)=L1;
  L(2)=Lmid;
  L(3)=Ln;
  B=exp(log_B);
  C=exp(log_C);
  M(1,1)=exp(-square((x(1)-B)/C));
  M(1,2)=x(1);
  M(1,3)=1;
  M(2,1)=exp(-square((x(mid)-B)/C));
  M(2,2)=x(mid);
  M(2,3)=1;
  M(3,1)=exp(-square((x(n)-B)/C));
  M(3,2)=x(n);
  M(3,3)=1;

  P=solve(M,L);  // solve for standard parameters 
                 // P is vector corresponding to A,D,E

  pred=P(1)*exp(-square((x-B)/C))+P(2)*x+P(3);
  if (current_phase()<4)
    f+=norm2(y-pred);
  else
    f+=0.5*n*log(norm2(y-pred))  //concentrated likelihood

BCBBC

ここに画像の説明を入力してください

不良データの場合、非常に簡単に適合し、(通常の)パラメーター推定値は次のとおりです。

         estimate    std dev
A      2.0053e-01 5.8723e-02
D      1.6537e-02 4.7684e-03
E     -1.8197e-01 7.3355e-02
B      3.0609e+00 5.0197e-01
C      5.6154e+00 9.4564e-01]

デイブ、これは面白いですが、いくつかの疑問が生じます。「これらの種類の非線形モデル」とはどういう意味ですか?質問は「ジェネリックフィッティング関数」を参照することから始まりますが、説明は「5つのパラメーター全体」のみを参照します。
whuber

vonbertalanffy、またはロジスティックまたは二重指数などのモデルを意味します。すべての場合において、モデルはいくつかのパラメーターでは線形であり、他のパラメーターでは非線形です。人々は一般的に、非線形パラメータに集中することにより、より安定したパラメータ化を得るためにそれらを変換しようとします。しかし、これは間違ったアプローチです。修正する必要があるのは線形パラメーター化です。たとえば、4パラメーターロジスティックの場合、モデルは上下漸近線で線形ですが、これらのパラメーターを使用するのではなく、最小および最大indの予測値を使用する必要があります。var。
デイブ・フルニエ

@davefournierあなたの論文に答えてくれてありがとう。あなたの論文を理解するのは少し難しいように見えますが、このテクニックは面白そうなので、読むのを待つことはできません。
固定小数点

2

これを何度も行う必要がある場合は、SSE関数の進化アルゴリズムをフロントエンドとして使用して、開始値を提供することをお勧めします。

一方、GEOGEBRAを使用して、パラメーターのスライダーを使用して関数を作成し、パラメーターを操作して開始値を取得できます。

または、データからの開始値は、観測によって推定できます。

  1. DおよびEは、データの勾配と切片から得られます(ガウスを無視します)
  2. Aは、Dx + Eライン推定からのガウスの最大値の垂直距離です。
  3. Bは、ガウスの最大値のx値です
  4. Cはガウスの見かけの幅の半分です

1

開始値については、通常の最小二乗近似を行うことができます。その勾配と切片はDとEの開始値になります。最大の残差はAの開始値になります。最大の残差の位置はBの開始値になります。

ただし、主題の知識から何らかのメカニズムの方程式を導き出さない非線形最小二乗はリスクの高いビジネスであり、多くの個別の適合を行うと事態はさらに疑わしくなります。提案された方程式の背後にある主題の知識はありますか?100個程度の個別の近似の違いに関連する他の独立変数はありますか?これらの違いを、一度にすべてのデータに適合する単一の方程式に組み込むことができれば役立つかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.