0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

#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)

スクリーンショット 2021-10-05 12.27.35.png

左から順に点を見ていくと、何かの曲線を表しているようにも見えます(自身で作成した点ですが、とりあえず「点のデータのみ持っている」という前提で進めます)。
このようなグラフにおいて、「$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)

スクリーンショット 2021-10-05 12.37.18.png

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)

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

まとめ

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

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?