scipy.linalg.lstsqを使ってみる
はじめに
最小二乗法でを解く関数。
が最小になる
を計算する。
戻り値
こいつは戻り値をたくさん返す。
x
解となる値residues
残差的なものrank
のrank
s
特異値らしい。よくわからんからwikipedia貼っといて後で見る。
ダミーデータの準備
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()
解く
後方のリストが冪乗を表している。今回の場合、となる。(合ってるかな?)
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()