静かなる名辞

pythonとプログラミングのこと


【python】scipyで線形最小二乗法

概要

 scipyのscipy.optimize.lsq_linearで最小二乗法が使えます。

使い方

 最低限必要な引数は、

  • A

 いわゆる説明変数です。基本的には(データ数, 次元数)のshapeでいいのですが、バイアス項を入れたければすべて1にした列が要ります。

  • b

 いわゆる目的変数です。(データ数,)のshapeで入れます。

 の2つだけです。他に色々なパラメータを設定できます。

 返り値はscipy.optimize.optimize.OptimizeResultという型で返り、表示すると最適化の結果をレポートしてくれます。単に係数を知りたければxというフィールドを見れば良いです。

scipy.optimize.lsq_linear — SciPy v1.2.1 Reference Guide

使ってみる

 簡単に試してみます。必要に応じてコメントを入れます。

>>> 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])
|<