漸近勾配を見つけるための数値アルゴリズムはありますか?


23

一連のデータポイントありそれらは(ほぼ)大規模な行に漸近する関数従うと予想されます。基本的に、はとしてゼロに近づき、おそらくすべての微分、についても同じことが言えます、など。しかし、f(x)の関数形式が何であるかは、それが基本関数の観点から説明できるものを持っている場合でもわかりません。(xi,yi)y(x)xf(x)y(x)(ax+b)xf(x)f(x)f(x)

私の目標は、漸近勾配aの可能な限り最良の推定値を取得することaです。明らかな大雑把な方法は、最後のいくつかのデータポイントを選択して線形回帰を行うことですが、もちろん、データがあるxの範囲内でf(x)が「十分にフラット」にならない場合、これは不正確になります。明らかに粗雑な方法は、f(x)\ approx \ exp(-x)(または他の特定の関数形式)を想定し、すべてのデータを使用してそれに適合することですが、私が試した単純な関数は\ exp (-x)または\ dfrac1 {x}は、f(x)の下のxのデータと完全には一致しませんxf(x)exp(x)exp(x)1xxf(x)は大きい。漸近勾配を決定するための既知のアルゴリズムはありますか、データが漸近線にどのように近づくかについての知識が不足しているので、信頼区間とともに勾配の値を提供できますか?


この種のタスクは、さまざまなデータセットを扱う作業で頻繁に発生する傾向があるため、主に一般的なソリューションに興味がありますが、リクエストにより、この質問を引き起こした特定のデータセットにリンクしています。コメントで説明されているように、Wynn ϵアルゴリズムは、私が知る限り、いくぶんオフの値を提供します。これがプロットです:

漸近線形データ

(高いx値でわずかに下向きの曲線があるように見えますが、このデータの理論モデルでは、漸近的に線形になるはずです。)


これはこのサイトにとっては初歩的すぎるかもしれませんし、曖昧すぎるかもしれませんが、プライベートベータはそのようなことを試す時だと思いました。
デビッドZ

いいえ、これは素晴らしい質問だと思います。すべてが高度で豪華である必要はありません。単純な問題に対する適切な解決策が重要です。
コリンK

@Dan:置き換えは本当に正当化されましたか?exp
JM

expを持っていると物事が読みづらくなる傾向がありますが、それが小さすぎてやるべきではなかったことは認めます。
ダン

私は本当にどちらの方法でも構いません。編集を承認するかもしれないと考えました。価値が何であれ、あなたはそれからいくつかの評判を得ます。
デビッドZ

回答:


13

それはかなり大まかなアルゴリズムですが、おおまかな見積もりには次の手順を使用します:あなたが言うように、が増加するにつれてあなたのを表すがほぼ線形である場合、私はd doは、差分、シャンクス変換のような外挿アルゴリズムを使用して、差分の限界を推定します。結果は、この漸近勾配の適切な推定値であることが望まれます。f(x)(xi,yi)xyi+1yixi+1xi


以下はMathematicaのデモです。Wynnアルゴリズムは、シャンクス変換の便利な実装であり、(隠された)関数として組み込まれています。関数で手順を試してみますϵSequenceLimit[]

4x2+3+2x+e4x+3
xdata = RandomReal[{20, 40}, 25];
ydata = Table[(3 + 13*E^(4*x) + 6*E^(4*x)*x + x^2 + 3*E^(4*x)*x^2 + 
      2*E^(4*x)*x^3)/(E^(4*x)*(3 + x^2)), {x, xdata}];

SequenceLimit[Differences[ydata]/Differences[xdata],
              Method -> {"WynnEpsilon", Degree -> 2}]
1.999998

アルゴリズムがいかに簡単かを示すこともできます。

wynnEpsilon[seq_?VectorQ] := 
 Module[{n = Length[seq], ep, res, v, w}, res = {};
  Do[ep[k] = seq[[k]];
   w = 0;
   Do[v = w; w = ep[j];
    ep[j] = 
     v + (If[Abs[ep[j + 1] - w] > 10^-(Precision[w]), ep[j + 1] - w, 
         10^-(Precision[w])])^-1;, {j, k - 1, 1, -1}];
   res = {res, ep[If[OddQ[k], 1, 2]]};, {k, n}];
  Flatten[res]]

Last[wynnEpsilon[Differences[ydata]/Differences[xdata]]]
1.99966

この実装は、ウェニガーの論文から改作されました。


好奇心が強いのですが、なぜすべての用語を組み合わせるのではなく、関数の元の形をしたのですか?
rcollyer

デモンストレーションのみを目的としていました。:) -ed式を含めたので、予想される答えが何であるかを知っています。私は何を証明したかったことは...あなたには、いくつかの複雑に見える機能の解析のこの種を行うことができますということでしたLATEX
JM

アルゴリズムが効果的であるためには、ポイントがどの程度平坦に近い必要がありますか?
rcollyer

2
さて、最後の質問(私は誓います)、推定値にバインドされたエラーを生成できますか?
rcollyer

1
それは少し複雑です。私はいくつかの論文でいくつかの提案された方法を見てきましたが、私はそれらで実験を行っていなかったことを告白します。(たぶん、これらの日のうちの1つです。)BrezinskiとRedivo-Zagliaによる本には、あなたが調べたいいくつかの指針があります。
JM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.