2017-03-03 6 views
2

私は、入力と出力のサンプルに基づいて数値を出力する非常に基本的なPythonコードをいくつか記述しようとしています。例えばもしそうなら:私はそれを別のxの値を渡すとyの値の大まかな近似値を得ることができるようにカーブフィットからのPython推定値

x = [1, 2, 3, 4, 5] 
y = [2, 5, 10, 17, 26] 

z = np.interp(7, xp, yp) 
print(z) ##expected 50, actual was 26 

私は一緒にこれらの値をマップする最良のフィット関数を見つけるいくつかの方法を持っているしたいと思います。私はscipy.optimize.curve_fitについて読んでみましたが、私の知る限りでは、これは私が使用しなければならないものではありません。

私の値は変わるかもしれないので、関数が線形/周期/二次などでなければならないことには制限がありませんが、私の仮定ではほとんどの関数は線形でなければなりません。

私もnumpy.interpを試しましたが、入力したxが何であってもyアレイの最後の値を取得しました。

編集: Clebの答えをいろいろと混ぜて、それをkennytmの元のアプローチと比較したところ、私の知見がここにあります。 enter image description hereここで最も正確な手法は、赤い線に最も近い関数でなければなりません。緑色の線はkennytmのアプローチを表しています(二次回帰は私が試した最も正確なものでした)。黒い線はClebの手法(UnivariateSpline)を表しています。 UnivariateSplineは基礎となるモデルに関する事前の知識がないので、幾分より正確な関数の値に適応するのが少し良いです。

+2

あなたが探しているコンセプトは[補間](https://en.wikipedia.org/wiki/Interpolation)です。 [scipy]で利用可能ないくつかのツールの説明については、例えば[補間に関するscipyチュートリアル(https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html)]を参照してください。 .interpolate'パッケージ](https://docs.scipy.org/doc/scipy/reference/interpolate.html)。 –

+0

1次元データの線形補間では、[numpy.interp() '](https://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html)が必要なものだけかもしれません。 –

+0

@warrenweckesser私はそれがあるとは思わない、私はそれを試した。最後の編集を確認してください。 – ninesalt

答えて

2

もう1つのオプションは、スプラインを使用することです。 scipy.interpolate.UnivariateSpline、あなたが根底にあるモデル(例えば、それが線形、立方体かどうかなど)と誇張を気にしないならば。

次に、あなただけの行うことができます。

from scipy.interpolate import UnivariateSpline 

x = [1, 2, 3, 4, 5] 
y = [2, 5, 10, 17, 26] 
spl = UnivariateSpline(x, y) 

x=7で見積もりを取得するには、今だけで行うことができます。

あなたが期待値を返す
spl(7) 

array(49.99999999999993) 

このアプローチは、モデルの定義を回避します。

+0

私はモデルを気にする必要はありません、それは私が確信していないことだけです。私はあなたのアプローチを試してみるでしょう、そして、私はそれがkennytmの答えの正確さと比較するでしょう。あなたのアプローチはどれくらい正確でしょうか? – ninesalt

+0

@ Swailem95:あなたの質問に一般的に答えられるかどうかはわかりません。それはあなたが扱うデータに依存します。私はスプラインと一緒にあなたの実際のデータをプロットし、それが "合理的かどうか"を確認します。あなたの比較結果を教えてください! – Cleb

+1

最後の編集を確認してください。 – ninesalt

2

私は約scipy.optimize.curve_fitについて読んでみましたが、私の知る限り、これは私の場合はあらかじめ定義された機能を使用しているため使用してはいけません。

実際にはscipy.optimize.curve_fitの機能は、あなたがフィットしたいモデルです。あなたは、あなたが使用し、線形回帰をしたいと言う:

二次回帰などについても同様
def linear(x, a, b): 
    return a*x + b 

fit_params, _ = scipy.optimize.curve_fit(linear, xp, yp) 
print(linear(7, *fit_params)) 
# 36.0 

def quadratic(x, a, b, c): 
    return a*x*x + b*x + c 

fit_params, _ = scipy.optimize.curve_fit(quadratic, xp, yp) 
print(quadratic(7, *fit_params)) 
# 50.000000000004555 

curve_fitの第2の戻り値は、ラフな絵を与える出力の共分散行列であり、どのように良いフィット感がある)


あなただけのあなただけのuse numpy.polyfit可能性、最小二乗で多項式に合うようにしたい場合。

linear_coeff = numpy.polyfit(xp, yp, deg=1) 
print(numpy.polyval(linear_coeff, 7)) 
# 35.999999999999986 

quadratic_coeff = numpy.polyfit(xp, yp, deg=2) 
print(numpy.polyval(quadratic_coeff, 7)) 
# 50.000000000000085 
+1

データセットに多項式を当てはめるには、もう一つのオプションは 'numpy.polyfit()'です。 –

+0

データが線形か二次式かわからない場合はどうすればよいですか?私の場合、私は1980年から2014年にかけて年を設定しており、毎年異なる値(電力消費量)にマッピングされており、必ずしも値に明確な傾向はありません。 – ninesalt

+2

@ Swailem95よくOPは "機能のほとんどは線形でなければならない"と述べた。私はあなたのデータがどのように見えるのか分からなければ、scipyが不十分だと思う。 – kennytm

関連する問題