Scipyを用いた補間処理(線形補間、スプライン補間)


Scipyを用いて補間処理を行う

「補間計算をPythonのScipyを用いてとりあえず実装してみたい!」という方向けです。
まずは、補間計算について。以下のコードを実行して、グラフを描画してみます。

#ライブラリの読み込み
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt

# xとして、linspaceで、開始が0、終了が10、項目が11個の等間隔数列を生成
x = np.linspace(0, 10, num=11, endpoint=True)
# yの値を生成
y = np.cos(-x ** 2.0 / 10.0)
plt.plot(x, y, 'o')
plt.grid(True)

左から順に点を見ていくと、何かの曲線を表しているようにも見えます(自身で作成した点ですが、とりあえず「点のデータのみ持っている」という前提で進めます)。
このようなグラフにおいて、「$x$が2.5のとき」など、点と点の間にある$x$に対応する$y$はどのような値をとるのだろうか? これを考えるのが補間計算です。

線形補間

Scipyでは、データ間の補間はinterp1dで計算できます。たとえば、以下では点と点の間を1次式でつないで補間(線形補間)しています。

from scipy import interpolate

# 線形補間の場合、interp1dのパラメータとして「linear」を指定する
f = interpolate.interp1d(x, y, 'linear')
plt.plot(x, f(x), '-')
plt.grid(True)

3次スプライン補間

次に、スプライン3次補間も加えて、グラフを描画します。スプライン3次補間は、点と点の間を3次の多項式で補間する手法です。

# スプライン3次補間を計算してf2として追加する。パラメータは「cubic」を指定。
f2 = interpolate.interp1d(x, y, 'cubic')

#曲線を出すために、xの値を細かくします。
xnew = np.linspace(0, 10, num=30, endpoint=True)

# fを直線で描き、f2を点線で描きます。
plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')

# 凡例
plt.legend(['data', 'linear', 'cubic'], loc='best')
plt.grid(True)


上のグラフでは、スプライン3次補間の方が良い補完に見えます。
ただし、あくまでこの補間した曲線は現在のデータすべてを利用して曲線を引いており、これが新しい未知のデータに対して当てはまるとは限りません。

まとめ

PythonのScipyを用いて、簡単な補間処理を行いました。補間処理は機械学習でも重要なので、様々な手法を知り、特徴を生かすことが大切に思われます。本記事がそのような目的の第一歩の手助けになれば幸いです。

参考記事
数値補間手法の食べ比べ
スプライン補間