線形回帰モデル② 最小二乗法による単回帰分析
前回記事では年齢データ
を最小にするような
を決定しました。しかし、パラメータ
入力ベクトル
となるようなベクトル関数
を考えて、各成分の平方和 (2乗和) が最小となるようなパラメータ
が最小になるように
となります。
このとき、
が成り立ちます。式を整理すると、
目的は
を定義して、上の連立方程式を行列形式で表すと
と表せます。このまま逆行列を計算すれば
となります。この行列は次のように分解できます。
ここで
のように定義すると、
と表せます。
と表せますが、これは次のような行列の積の形に書き直せます。
これは
と表すことができるので、両辺に左側から
というように、パラメータベクトルを決定することができます。
単回帰分析 (目標データを1つの入力変数で説明する近似手法) に限るなら、パラメータを決定するために、ここまで凝ったことをする必要はありません。しかし、入力データの種類が増えたり、基底関数近似を扱うときにも同じ方法が使えるので、汎用性の高い手法といえます。もう少し先に進むと、その恩恵を実感できるので、今のうちに行列計算に慣れておいてください。
前回記事と同じ年齢
# Least_squares_method
# In[1]
import numpy as np
# 疑似逆行列関数を定義
def pseudo_inverse(x):
return np.linalg.inv(x.T @ x) @ x.T
# 20人の年齢と体重のデータセット
# 年齢は25歳以下に限定
x = np.array([9, 21, 6, 18, 5,
6, 7, 12, 10, 20,
17, 3, 24, 9, 18,
23, 12, 13, 16, 13])
y = np.array([29.01, 78.1, 18.78, 57.94, 14.81,
22.34, 26.31, 41.69, 35.25, 60.92,
69.08, 16, 66.39, 27.06, 68.03,
61.45, 42.07, 40.64, 59.62, 32.22])
# xとt=[1,1,...1]をまとめて行列にする
X = np.array([x, np.ones(len(x))]).T
# Xの疑似逆行列を求める
pi_X = pseudo_inverse(X)
# パラメータベクトルの決定
p = pi_X @ y
print(p)
# [3.00922779 3.9646159]
前回とほぼ同じ結果が表示されます。年齢
で表されることになります。たとえば、年齢が 21 歳である場合には、
となります。
コメント
下記は誤植と思われますので、ご確認ください。
(4),(6),(7) 式で、ax-bt → ax+bt
(5) 式で、ax-bt → y-ax-bt
(12) 式の右辺のベクトルの ( ) → [ ]
(17) 式の下の文章で、式 (1) の右辺 → 式 (13) の右辺
線形代数の新着記事「ケーリー・ハミルトンの定理」をアップしました。お時間のある時にお立ち寄りください。m(_ _)m
それにしても学習ペースが速いですね。
微積分や線形代数を前提とするので、決して易しくはない内容のはずなんですが…
理工学部の学生さんでしょうか?
大切なお時間を使って記事の訂正にご協力いただき、本当にありがとうございます。m(_ _)m