11

私はPythonでいくつかの作業を行いましたが、scipy. ライブラリのメソッドを使用してinterpolate、一連のデータを近似する関数を考え出そうとしています。

開始するためにいくつかの例を調べたところ、Python(x,y) で動作する以下のサンプル コードを取得できました。

import numpy as np
from scipy.interpolate import interp1d, Rbf
import pylab as P

# show the plot (empty for now)
P.clf()
P.show()

# generate random input data
original_data = np.linspace(0, 1, 10)

# random noise to be added to the data
noise = (np.random.random(10)*2 - 1) * 1e-1

# calculate f(x)=sin(2*PI*x)+noise
f_original_data = np.sin(2 * np.pi * original_data) + noise

# create interpolator
rbf_interp = Rbf(original_data, f_original_data, function='gaussian')

# Create new sample data (for input), calculate f(x) 
#using different interpolation methods
new_sample_data = np.linspace(0, 1, 50)
rbf_new_sample_data    = rbf_interp(new_sample_data)

# draw all results to compare
P.plot(original_data, f_original_data, 'o', ms=6, label='f_original_data')
P.plot(new_sample_data, rbf_new_sample_data, label='Rbf interp')
P.legend()

プロットは次のように表示されます。

補間プロット

Rbfさて、 によって作成された補間関数(つまり として作成されたメソッド)を表す多項式を取得する方法はありますrbf_interpか?

または、これが で不可能な場合はRbf、別の補間方法、別のライブラリ、または別のツールを使用した提案も歓迎します。

4

5 に答える 5

5

答えはノーです。式を書き留める「良い」方法はありません。少なくとも、簡単な方法ではありません。RBF や Loess などの一部のタイプの補間では、データに適合するパラメトリック数学関数を直接検索せず、代わりに新しいデータ ポイントの値を他のポイントの関数として個別に計算します。

これらの補間は、常にデータに適切に適合することが保証されています(あなたの場合など)。その理由は、それらを記述するには非常に多数のパラメーター(基本的にすべてのデータポイント)が必要だからです。次のように考えてください。連続するデータ ポイントを直線で接続することにより、線形補間を行うことができます。この方法で任意のデータを適合させ、関数を数学的な形式で記述することができますが、多数のパラメーター (少なくともポイントの数と同数) が必要になります。実際、あなたが今していることは、それを滑らかにしたものです。

数式を短くしたい場合、これは、多くのパラメーターを持たない数学関数でデータを記述したいということです (具体的には、パラメーターの数はデータ ポイントの数よりもはるかに少なくする必要があります)。そのような例は、ロジスティック関数、多項式関数、さらには正弦関数 (データの生成に使用したもの) です。明らかに、どの関数がデータを生成したかを知っていれば、それが当てはめたい関数になります。

于 2012-09-26T12:33:06.117 に答える
4

RBFは、要求された関数を使用します。もちろん、グローバルモデルであるため、関数の結果がありますが、もちろん、多くのガウス分布の合計であるため、おそらく気に入らないでしょう。あなたが得た:

 rbf.nodes   # the factors for each of the RBF (probably gaussians)
 rbf.xi      # the centers.
 rbf.epsilon # the width of the gaussian, but remember that the Norm plays a role too

したがって、これらのことで距離を計算できます(次に、ガウス関数(または使用するように要求した関数)のrbf.xi内外の係数を使用して距離をプラグrbf.nodesインします)(およびのPythonコードを確認できます)rbf.epsilon__call___call_norm

したがってsum(rbf.nodes[i] * gaussian(rbf.epsilon, sqrt((rbf.xi - center)**2)) for i, center in enumerate(rbf.nodes))、面白いハーフコード/式を与えるようなものが得られます。RBF関数はドキュメントに記述されていますが、Pythonコードを確認することもできます。

于 2012-09-26T14:39:41.720 に答える
1

RBF はおそらく の略ですRadial Basis Functionscipy.interpolate.Rbfあなたが探している機能だったとしても、私は驚かないでしょう。

ただし、結果を表す多項式を見つけることができるとは思えません。

別の補間方法を試してみたい場合は、RBF、スプラインへのリンクを提供する対応するScipy ドキュメントを確認してください...

于 2012-09-26T11:48:38.727 に答える
1

SciPy の RBF が実際の機能を提供するとは思いません。しかし、できることの 1 つは、SciPy の RBF が提供する関数 (つまり 100 ポイント) をサンプリングすることです。次に、それらの点でラグランジュ解釈を使用します。これにより、多項式関数が生成されます。これがどのように見えるかの例を次に示します。ラグランジュ補間を使いたくない場合は、「ニュートンの被除数差法」を使って多項式関数を生成することもできます。ここに画像の説明を入力

于 2018-01-01T18:17:07.123 に答える