freedom-_-qの勉強履歴

メモ書きが主になるかと思います。勉強強制のために一日一記事目指してます。頭良くないので間違いが多々あるかと思います。

scipy.linalg.lstsqを使ってみる

はじめに

最小二乗法で Ax = bを解く関数。 |b-Ax|が最小になる xを計算する。

戻り値

こいつは戻り値をたくさん返す。

  • x
    解となる値

  • residues
    残差的なもの

  • rank
     aのrank

  • s
    特異値らしい。よくわからんからwikipedia貼っといて後で見る。

    A の随伴行列 A との積 AA固有値の非負の平方根のことである

ダミーデータの準備

import numpy as np
import matplotlib.pyplot as plt

f = lambda x: 2*x + 5
x = np.linspace(0, 10, 20) + 10*np.random.random(20)
y = f(x) + 10*np.random.random(20)

plt.scatter(x, y)
plt.show()

f:id:freedom-_-q:20210705233555p:plain

解く

後方のリストが冪乗を表している。今回の場合、 ax + bとなる。(合ってるかな?)

a = x[:, np.newaxis]**[0, 1]
#array([[ 4.30949795,  1.        ],
#       [ 0.79415921,  1.        ],
#       [ 9.60978325,  1.        ],
#       [ 8.31766479,  1.        ],
#       [ 6.63658646,  1.        ],
#       [ 5.06167759,  1.        ],
#       [ 9.37423971,  1.        ],
#       [11.12535215,  1.        ],
#       [11.17577981,  1.        ],
#       [13.16247375,  1.        ],
#       [ 9.54455248,  1.        ],
#       [ 6.71187812,  1.        ],
#       [13.01093893,  1.        ],
#       [ 8.21608915,  1.        ],
#       [12.25533427,  1.        ],
#       [13.33704129,  1.        ],
#       [16.96820584,  1.        ],
#       [15.80414464,  1.        ],
#       [10.74845677,  1.        ],
#       [11.94031956,  1.        ]])

p, *_ = lstsq(a, y)

plt.scatter(x, y)
plt.plot(x, p[0]*x+p[1])
plt.show()

f:id:freedom-_-q:20210706002450p:plain