[SciPy] 22. ノイジーなデータをsignalのsavgol_filterで平滑化

matplotlib

はじめに

scipyのsavgol_filterを使って、ノイズの多いデータを滑らかにする方法について説明する。

コード&解説

モジュールのインポート

バージョン

データの作成

指数関数的減衰にノイズを加えたデータを作成する。

フィルタ適用範囲 (window_length)

window_lengthでフィルタを適用する範囲を設定する。window_length は奇数の整数である必要がある。
window_lengthを5, 15,25としてフィルターをかけたデータを作成した。

データを表示すると以下のようになる。window_lengthが大きいほどデータが滑らかになる。

近似式の次数 (polyorder)

多項式近似のための多項式の次数をpolyorderで指定する。ここでは、window_lengthを25として、polyorderを1,2,4とした。つまり、1次、2次、4次の多項式で近似を行うことになる。

結果を表示すると以下のようになる。

1次式近似ではフィルタデータは直線的になり、4次だとデータに追従した感じの結果となった。

境界近傍データの計算について (mode)

modeでデータの境界におけるフィルタの処理を設定する。
modeは‘mirror’, ‘constant’, ‘nearest’, ‘wrap’ または ‘interp'(default)といずれかにする。

mirrorは境界の値を逆順に繰り返して計算を行う。
constantは定数を適用する。定数の値はcvalで設定する。
nearestは境界の値を繰り返して計算を行う。
wrapは配列のもう一方の端にある値を用いて計算する。つまり、同じ配列を直列に結合して計算を行うことになる。

それぞれのmodeの結果を表示すると以下のようになる。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

参考

scipy.signal.savgol_filter — SciPy v1.9.1 Manual

コメント