概要
scipyのscipy.optimize.lsq_linearで最小二乗法が使えます。
使い方
最低限必要な引数は、
- A
いわゆる説明変数です。基本的には(データ数, 次元数)のshapeでいいのですが、バイアス項を入れたければすべて1にした列が要ります。
- b
いわゆる目的変数です。(データ数,)のshapeで入れます。
の2つだけです。他に色々なパラメータを設定できます。
返り値はscipy.optimize.optimize.OptimizeResultという型で返り、表示すると最適化の結果をレポートしてくれます。単に係数を知りたければxというフィールドを見れば良いです。
使ってみる
簡単に試してみます。必要に応じてコメントを入れます。
>>> import numpy as np >>> X = np.random.rand(100, 3) # ランダムなXを作成 >>> X[:,2] = 1 # バイアス項を設定 # 適当なyを作成。正規分布するノイズをまぶす >>> y = 2*X[:,0] + 3*X[:,1] + 4 +0.5*np.random.randn(100) >>> from scipy import optimize >>> result = optimize.lsq_linear(X, y) >>> result active_mask: array([ 0., 0., 0.]) cost: 12.474073406201914 # コスト関数の値 # 残差 fun: array([-0.62398486, 0.3072979 , -0.10238148, -0.4993848 , 0.0734566 , -0.06842613, -0.78150259, -0.28869525, -0.29234346, -0.09920162, 0.67799186, 0.47657423, -0.14040916, 0.22752255, 0.35423127, 0.90124369, 0.31145881, 0.12874122, 1.03422167, -0.30381206, -0.22739989, -0.02065523, 0.3710351 , 0.12505248, 0.29515137, -0.20530665, -0.19887154, 0.2782884 , -0.03371473, -0.82749514, 0.4542083 , 0.00581736, -0.11176233, 0.7640272 , 0.59850616, 0.21529376, 0.29703533, 0.85004091, 0.73353464, -0.07128385, -0.86266412, -0.02184265, -0.57813797, 0.58658777, -0.11631637, 0.38530319, -1.52933752, -0.2369261 , -0.30857852, 0.68003027, 0.07390349, -0.54587462, 0.22403256, -0.08884161, 0.40610932, -0.41575813, 0.14871697, 0.34747144, -0.54337788, -0.02348569, 0.44514965, -0.03702159, 0.07137893, -0.55835038, 0.65997585, 0.42452063, 0.71298796, -0.019805 , 0.32504799, 0.51807313, 0.09903619, -0.99172989, -0.04408202, -0.20914935, 0.37428201, -0.49526746, -0.87998355, -1.03734365, -0.44080683, -0.5162824 , 1.19186206, -0.64073783, -0.10657965, -0.07972209, -0.36248635, 0.47518401, -0.12845207, -0.44213326, -0.67951796, 0.44330662, -0.25102293, 0.5503437 , 0.10920638, 0.21309121, -0.06616317, -0.10048913, -0.32081914, -0.1639193 , -1.00984118, 0.803146 ]) message: 'The unconstrained solution is optimal.' nit: 0 optimality: 5.5777604757167865e-13 status: 3 success: True # 係数 x: array([ 2.03207968, 3.19444993, 3.90466908]) >>> result.x array([ 2.03207968, 3.19444993, 3.90466908]) |<