【Python】スプライン曲線の書き方

  • 2020年6月16日
  • 2020年6月16日
  • Python

 スプライン曲線はいくつかの式を組み合わせて自由な曲線をなるべく簡単に作ろうとする手法です。画像でいえば赤の曲線と青の曲線とまた別の赤の曲線を組み合わせて複雑な曲線を作っています。

B-スプライン曲線 – Wikipedia
 ざっくばらんに中身の式の例を書けば次の様になります。適当に分けられた区分の中でそれぞれ別の式が定義されているわけです。

 このそれぞれの式の作り方を与えられた点群に近似し、連続した値にする、という目的を達成する作り方としてPython上で扱います。
 コード例は次です。
 scipy.interpolate.UnivariateSpline — SciPy v1.4.1 Reference Guide

import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
import numpy as np


def main():
    # テストデータの適当な点を作成
    x = np.linspace(-3, 3, 50)
    y = np.exp(-x ** 2) + 0.1 * np.random.randn(50)
    # 点をプロット
    plt.plot(x, y, 'ro', ms=5)

    # スプライン曲線を定義. ライブラリからの呼び出しだけでOK.
    # kは滑らかさを定義する引数
    spl = UnivariateSpline(x, y, k=5)

    # スプライン曲線を描画するX軸の値を定義
    xs = np.linspace(-3, 3, 1000)
    # スプライン曲線をプロット
    plt.plot(xs, spl(xs), 'g', lw=3)
    # プロットした諸々を表示
    plt.show()


if __name__ == '__main__':
    main()

 結果は次の画像です。ランダムノイズ等がのった荒れた点を滑らかに表現するのに便利です(単に表現するだけでなく滑らかにする方法を探索する場合はさすがに別の畑ですが)。無理に移動平均を取るなどして重い処理をする必要もありません。

 少々複雑になりますが例で使用した UnivariateSpline 関数以外にも制御と表現が複雑になった他関数がいくつもあります。
Interpolation (scipy.interpolate) — SciPy v1.4.1 Reference Guide

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG