2

たとえば、不明な関数によって返される値があります

# this is an easy case - parabolic function
# but in my case function is realy unknown as it is connected to process execution time
[0, 1, 4, 9]

次の値を予測する方法はありますか?

4

9 に答える 9

4

ニューラルネットワークアプローチを使用してみることができます。グーグルのクエリ「ニューラルネットワーク関数近似」で見つけることができる記事はかなりたくさんあります。多くの本も利用できます。たとえば、この本です。

于 2009-07-19T21:14:27.247 に答える
4

必ずしも。「放物線関数」は次のように実装できます。

def mindscrew
  @nums ||= [0, 1, 4, 9, "cat", "dog", "cheese"]
  @nums.pop
end

推測することはできますが、確実に予測することは不可能です。

于 2009-07-19T20:59:38.743 に答える
4

データポイントだけが必要な場合

既知のポイントの外側のデータの外挿は推定できますが、既知のポイントのデータの内挿よりも電位差がはるかに大きいことを受け入れる必要があります。厳密には、関数は、正常に動作する連続関数であっても、既知のポイント間でクレイジーなことを行う可能性があるため、どちらも任意に不正確になる可能性があります。そして、それ行儀が悪い場合、すべての賭けはすでにオフになっています;-p

これには多くの数学的アプローチがあります(コンピュータサイエンスに直接適用されます)。単純な線形代数から3次スプラインのようなものまであります。そしてその間のすべて。

機能が必要な場合

難解になる; ここでのもう1つの興味深いモデルは、遺伝的プログラミングです。既知のデータポイント上で式を展開することにより、適切に近い近似を見つけることができます。時々それは動作します。時々そうではありません。探していた言語ではありませんが、Jason Bockは、.NET 3.5でこれを行うC#コードをいくつか示しています。ここでは、進化するLINQ式を示しています。

私はたまたま彼のコードを「手渡す」ために持っています(私はいくつかのプレゼンテーションでそれを使用しました)。ほぼ瞬時に検出されますa => a * aが、(理論的には)事実上すべてのメソッドを検出できるはずですが、最大ランレングスは定義されていません; -p行き止まり(進化論的に言えば)に入る可能性もあります。あなたは単に回復することはありません...

于 2009-07-19T21:04:06.750 に答える
2

一般に、いいえ...それが特定の形式の関数(たとえば、ある程度Nの多項式)であり、関数を制約するのに十分な情報がある場合を除きます。

たとえば、二次方程式であることがわかっていなくても必ずしもn ^ 2を仮定できない理由については、より「通常の」反例(チャックの回答を参照)の場合、f(n)= n 4-6n 3 + 12n2- 6n、これはn = 0,1,2,3,4,5 f(n)=0,1,4,9,40,145の場合です。

それが特定の形式であることがわかっている場合は、いくつかのオプションがあります...形式が基底関数の線形結合である場合(たとえば、f(x)= a + b cos(x)+ c sqrt(x))、最小二乗法を使用します-二乗法は、これらの基底関数を使用して最適な未知の係数を取得できます。

于 2009-07-20T21:12:37.757 に答える
2

WolframAlphaAPIを使用してください:)

于 2009-07-19T21:02:52.230 に答える
2

はい。多分。

いくつかの入力値と出力値がある場合、つまり[0,1,2,3]と[0,1,4,9]の場合、応答曲面(基本的には関数フィッティング)を使用して「推測」することができます。実際の関数(この場合はf(x)= x ^ 2)。推測関数をf(x)= c1 * x + c2 * x ^ 2 + c3とすると、入力と出力が与えられ、結果が与えられると、c1 = 0、c2 = 1、c3=0と決定するアルゴリズムがあります。次の値を予測できる関数。

この質問に対する他のほとんどの回答も有効であることに注意してください。ある関数をデータに適合させたいと思っているだけです。言い換えれば、私はあなたの質問がかなり曖昧だと思います、あなたの質問をできるだけ完全に提起するようにしてください!

于 2009-07-19T21:06:35.297 に答える
1

統計的手法を適用して次の答えを推測することはできますが、関数が次のようなものである場合はうまく機能しない可能性があります(c):

int evil(void){
  static int e = 0;
  if(50 == e++){
    e = e * 100;
  }
  return e;
}

この関数は、単純な増加数を返します...BAM。

于 2009-07-19T20:57:47.777 に答える
1

この質問も参照してください。

于 2009-07-21T17:11:45.210 に答える
0

それは難しい問題です。

このような作業が可能な特殊なケースについては、漸化式を確認する必要があります。

于 2009-07-19T21:03:11.417 に答える