Scipy scipy.optimize.curve_fit メソッド

Suraj Joshi 2023年1月30日
  1. scipy.optimize.curve_fit() の構文:
  2. コード例:scipy.optimize.curve_fit() データに直線を当てはめるメソッド(線形モデル式
  3. コード例:scipy.optimize.curve_fit() 指数曲線をデータに適合させるメソッド(指数モデル式
Scipy scipy.optimize.curve_fit メソッド

Python Scipy scipy.optimize.curve_fit() 関数は、最小二乗近似を使用して最適なパラメーターを求めるために使用されます。curve_fit メソッドは、モデルをデータに適合させます。

カーブフィットは、提供された一連の観測値に最適な、定義された関数のパラメーターの最適なセットを求めるために不可欠です。

scipy.optimize.curve_fit() の構文:

scipy.optimize.curve_fit(f, xdata, ydata, sigma=None, p0=None)

パラメーター

f モデル関数です。最初の引数として独立変数を取り、残りの個別の引数として適合するパラメーターを取ります。
xdata 配列のような。独立変数または関数への入力。
ydata 配列のような。従属変数。関数の出力。
sigma オプションの値。これは、データの推定不確実性です。
p0 パラメータの初期推定。カーブフィットは、ハンティングを開始する場所、パラメーターの妥当な値を認識している必要があります。

戻り値

2つの値を返します。

  1. popt:配列のようなもの。モデル関数の最適値が含まれています。内部には、slope のフィット結果と intercept のフィット結果を含みます。
  2. p-cov:共分散。近似結果の不確実性を示します。

コード例:scipy.optimize.curve_fit() データに直線を当てはめるメソッド(線形モデル式

import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy import optimize


def function(x, a, b):
    return a * x + b


x = np.linspace(start=-50, stop=10, num=40)
y = function(x, 6, 2)

np.random.seed(6)
noise = 20 * np.random.normal(size=y.size)
y = y + noise

popt, cov = scipy.optimize.curve_fit(function, x, y)
a, b = popt

x_new_value = np.arange(min(x), 30, 5)
y_new_value = function(x_new_value, a, b)

plt.scatter(x, y, color="green")
plt.plot(x_new_value, y_new_value, color="red")
plt.xlabel("X")
plt.ylabel("Y")
print("Estimated value of a : " + str(a))
print("Estimated value of b : " + str(b))
plt.show()

scipy.optimize.curve_fit メソッドを使用した直線へのカーブフィット

出力:

Estimated value of a : 5.859050240780936
Estimated value of b : 1.172416121927438

この例では、最初に y = 6*x+2 の式を使用して 40 ポイントのデータセットを生成します。次に、データセットの y 値にガウスノイズを追加して、よりリアルに見せます。ここで、基礎となる方程式 y=a*x+b のパラメーターab を推定します。これにより、scipy.optimize.curve_fit() メソッドを使用してデータセットが生成されます。プロットのの点はデータセットの実際のデータ点を表し、の線は scipy.optimize.curve_fit() メソッドを使用してデータセットに適合した曲線を表します。

最後に、scipy.optimize.curve_fit() メソッドを使用して推定された ab の値は、それぞれ 5.8591.172 であり、実際の値 6にかなり近いことがわかります。2

コード例:scipy.optimize.curve_fit() 指数曲線をデータに適合させるメソッド(指数モデル式

import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy import optimize


def function(x, a, b):
    return a * np.exp(b * x)


x = np.linspace(10, 30, 40)

y = function(x, 0.5, 0.3)
print(y)

noise = 100 * np.random.normal(size=y.size)
y = y + noise
print(y)
popt, cov = scipy.optimize.curve_fit(function, x, y)

a, b = popt

x_new_value = np.arange(min(x), max(x), 1)
y_new_value = function(x_new_value, a, b)

plt.scatter(x, y, color="green")
plt.plot(x_new_value, y_new_value, color="red")
plt.xlabel("X")
plt.ylabel("Y")
print("Estimated value of a : " + str(a))
print("Estimated value of b : " + str(b))
plt.show()

scipy.optimize.curve_fit メソッドを使用した指数曲線へのカーブフィット

出力:

Estimated value of a : 0.5109620054206334
Estimated value of b : 0.2997005016319089

この例では、最初に方程式 y = 0.5*x^0.3 を使用して 40 ポイントのデータセットを生成します。次に、データセットの y 値にガウスノイズを追加して、より現実的にします。ここで、scipy.optimize.curve_fit() メソッドを使用してデータセットを生成する基礎となる方程式 y = a*x^b のパラメーターab を推定します。プロットの緑の点はデータセットの実際のデータ点を表し、の線は scipy.optimize.curve_fit() メソッドを使用してデータセットに適合した曲線を表します。

最後に、scipy.optimize.curve_fit() メソッドを使用して推定された ab の値は、それぞれ 0.51090.299 であり、実際の値 0.5にかなり近いことがわかります。0.3

このようにして、scipy.optimize.curve_fit() メソッドを使用して、特定のデータポイントの基礎となる方程式を決定できます。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn