Scipy.interpolate を使った様々な補間法

<a href="https://qiita.com/maskot1977/items/2a55c087974d0ac5e843">様々な補間法と最小2乗法をPythonで理解する</a> のうち、「Scipy.interpolate を使った様々な補間法」を、実データっぽい模擬データを解析するように書き直したサンプルプログラムです。

# 実データっぽい模擬データ

こういうデータを補間したいとしましょう。

```python
x_observed = [9, 28, 38, 58, 88, 98, 108, 118, 128, 138, 148, 158, 168, 178, 188, 198, 208, 218, 228, 238, 278, 288, 298]
y_observed = [51, 80, 112, 294, 286, 110, 59, 70, 56, 70, 104, 59, 59, 72, 87, 99, 64, 60, 74, 151, 157, 57, 83]
```

# まずはデータの図示

こういうデータですね。

```python
%matplotlib inline
import matplotlib.pyplot as plt

plt.scatter(x_observed, y_observed)
plt.grid()
```



![output_1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/c69856e7-8330-d97b-6ed0-f84d1c5494c7.png)



# 補間する x 座標を作る

実データの最小値から最大値までの間に等間隔に１００ポイント作りました。

```python
import numpy as np
x_latent = np.linspace(min(x_observed), max(x_observed), 100)
```

# Scipy で使用可能な様々な補間法

こんなに使えて便利ですね。


```python
from scipy import interpolate
ip1 = ["最近傍点補間", lambda x, y: interpolate.interp1d(x, y, kind="nearest")]
ip2 = ["線形補間", interpolate.interp1d]
ip3 = ["ラグランジュ補間", interpolate.lagrange]
ip4 = ["重心補間", interpolate.BarycentricInterpolator]
ip5 = ["Krogh補間", interpolate.KroghInterpolator]
ip6 = ["2次スプライン補間", lambda x, y: interpolate.interp1d(x, y, kind="quadratic")]
ip7 = ["3次スプライン補間", lambda x, y: interpolate.interp1d(x, y, kind="cubic")]
ip8 = ["秋間補間", interpolate.Akima1DInterpolator]
ip9 = ["区分的 3 次エルミート補間", interpolate.PchipInterpolator]
```

# 補間してみましょう。

補間法の違いによって、結果は様々です。

```python
for method_name, method in [ip1, ip2, ip3, ip4, ip5, ip6, ip7, ip8, ip9]:
    print(method_name)
    fitted_curve = method(x_observed, y_observed)
    plt.scatter(x_observed, y_observed, label="observed")
    plt.plot(x_latent, fitted_curve(x_latent), c="red", label="fitted")
    plt.grid()
    plt.legend()
    plt.show()
```

    最近傍点補間


![output_4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/06d52627-a3b7-ad06-25bf-0ac76e685c75.png)


    線形補間


![output_4_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/a9be4337-f687-73ce-1c79-c853210a24fc.png)


    ラグランジュ補間


![output_4_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/76d8219f-4e1f-b111-b892-6429132f21c5.png)


    重心補間


![output_4_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/0c9396c7-febd-519e-954f-315669defacb.png)


    Krogh補間


![output_4_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/fe4373f7-eacd-75fe-e475-02b4de341187.png)



    2次スプライン補間


![output_4_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/4ccf2d5c-7cd2-c72e-bdc5-c528faf04d5d.png)


    3次スプライン補間


![output_4_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/246ffad4-6752-1660-2cd3-c9e944688a78.png)



    秋間補間


![output_4_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/2a96a5b4-dd35-5348-ef4c-53f9f4b19a4b.png)


    区分的 3 次エルミート補間


![output_4_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/127f6061-63e8-8e14-445d-9e8d91f0dae2.png)


# 参考

<a href="https://qiita.com/maskot1977/items/f9e84fb6e62f7015d6c4">Numpy.polyfit を使ったカーブフィッティング</a> もご参考にどうぞ。