Scipy-interpolate

提供:Dev Guides
移動先:案内検索

SciPy-補間

この章では、SciPyで補間がどのように役立つかについて説明します。

補間とは何ですか?

補間は、直線または曲線上の2点間の値を見つけるプロセスです。 意味を思い出すために、単語の最初の部分である「inter」は「enter」を意味すると考えてください。これは、元々持っていたデータの「内部」を見るように思い出させます。 このツールである補間は、統計だけでなく、科学、ビジネス、または既存の2つのデータポイントに含まれる値を予測する必要がある場合にも役立ちます。

いくつかのデータを作成し、 scipy.interpolate パッケージを使用してこの補間を実行する方法を見てみましょう。

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
print x,y

上記のプログラムは、次の出力を生成します。

(
   array([0.,  0.36363636,  0.72727273,  1.09090909,  1.45454545, 1.81818182,
          2.18181818,  2.54545455,  2.90909091,  3.27272727,  3.63636364,  4.]),

   array([-0.65364362,  -0.61966189,  -0.51077021,  -0.31047698,  -0.00715476,
           0.37976236,   0.76715099,   0.99239518,   0.85886263,   0.27994201,
          -0.52586509,  -0.99582185])
)

これで、2つの配列ができました。 これらの2つの配列を空間内のポイントの2つの次元と仮定して、次のプログラムを使用してプロットし、それらがどのように見えるかを見てみましょう。

plt.plot(x, y,’o’)
plt.show()

上記のプログラムは、次の出力を生成します。

補間

1次元内挿

scipy.interpolateのinterp1dクラスは、固定データポイントに基づいて関数を作成する便利なメソッドです。これは、線形補間を使用して、指定されたデータによって定義されるドメイン内の任意の場所で評価できます。

上記のデータを使用して、補間関数を作成し、新しい補間グラフを描画しましょう。

f1 = interp1d(x, y,kind = 'linear')

f2 = interp1d(x, y, kind = 'cubic')

interp1d関数を使用して、2つの関数f1とf2を作成しました。 これらの関数は、指定された入力xに対してyを返します。 3番目の変数の種類は、補間手法のタイプを表します。 「線形」、「最近接」、「ゼロ」、「線形」、「二次」、「立方」は、補間のいくつかの手法です。

次に、補間の明確な違いを確認するために、より長い新しい入力を作成しましょう。 古いデータと同じ機能を新しいデータで使用します。

xnew = np.linspace(0, 4,30)

plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')

plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')

plt.show()

上記のプログラムは、次の出力を生成します。

1-D補間

スプライン

データ点を通る滑らかな曲線を描くために、製図者はかつて、木材、硬質ゴム、金属、または機械的スプラインと呼ばれるプラスチックの薄い柔軟なストリップを使用していました。 メカニカルスプラインを使用するには、デザイン内の曲線に沿った適切なポイントにピンを配置し、スプラインを曲げて、これらの各ピンに接触させました。

明らかに、この構造では、スプラインはこれらのピンで曲線を補間します。 他の図面で曲線を再現するために使用できます。 ピンが配置されているポイントは、ノットと呼ばれます。 ノットの位置を調整することにより、スプラインによって定義された曲線の形状を変更できます。

単変量スプライン

1次元の平滑化スプラインは、指定されたデータポイントのセットに適合します。 scipy.interpolateのUnivariateSplineクラスは、固定データポイントクラスに基づいて関数を作成する便利なメソッドです– scipy.interpolate.UnivariateSpline(x、y、w = None、bbox = [None、None]、k = 3、s =なし、ext = 0、check_finite = False)。

パラメータ-以下は、単変量スプラインのパラメータです。

これは、k次のスプラインy = spl(x)を指定されたx、yデータに適合させます。

'w'-スプラインフィッティングの重みを指定します。 正でなければなりません。 なし(デフォルト)の場合、重みはすべて等しくなります。

「s」-平滑化条件を指定してノットの数を指定します。

'k'-平滑化スプラインの度合い。 5以下でなければなりません。 デフォルトは3次スプラインであるk = 3です。

Ext-ノットシーケンスで定義された間隔にない要素の外挿モードを制御します。

  • ext = 0または「外挿」の場合、外挿値を返します。
  • ext = 1または「ゼロ」の場合、0を返します
  • ext = 2または「raise」の場合、ValueErrorが発生します
  • ext = 3が「const」の場合、境界値を返します。

check_finite –入力配列に有限数のみが含まれていることを確認するかどうか。

次の例を考えてみましょう。

import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50)
plt.plot(x, y, 'ro', ms = 5)
plt.show()

平滑化パラメーターにはデフォルト値を使用します。

スプライン

spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'g', lw = 3)
plt.show()

スムージングの量を手動で変更します。

スプラインスムージング

spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), 'b', lw = 3)
plt.show()

スプラインスムージング