おいしいブログ

線形回帰を実装してみる #1

機械学習系エントリの続き。今回は線形回帰と最小二乗法について、基本的な所を実装してみる。

https://ja.wikipedia.org/wiki/線形回帰 - Wikipedia

https://ja.wikipedia.org/wiki/最小二乗法 - Wikipedia

細かい話は置いておいて早速。まずはおなじみ、sklearnのデータセットに含まれるボストンの住宅価格を利用する。

毎度おなじみ。RM(部屋数)列と価格の散布図をプロットして中身を確認する。

まずは、sklearnを利用し、回帰直線 y = ax + b を引いてみる。LinearRegression#fit.

from sklearn.linear_model import LinearRegression

x_train = X.values.reshape(X.values.shape[0], 1)
lr = LinearRegression()
lr.fit(x_train, Y.values)

sklearnが作成したモデルに直線を引かせるとそれっぽいのがプロットされる。

係数=9.10210898, y切片:-34.67062077643857というパラメータが得られました。これを正解として、今回の回帰式を手動で求める。

// TODO 数式(埋め込むのが超面倒😩)

  • 係数aは、 xとyの共分散をxの分散で割る
  • y切片bは、y平均から係数aとx平均をかけたものを引く

とすることで求まるということなので、こんな感じのコードを書く。

a = cov(x, y) / var(x)
b = avg(y) - a * avg(x) 

で、出来上がったのが以下のコードで、係数と切片を求めることが出来た。

出来上がった y = ax + b の直線をsklearnが引いた直線に重ねてみると、

ちょっとわかりにくいですが、元あった赤線に今回引いた緑線が重なったので同じ回帰式が求められたといえるでしょう😊

最後に、求めた係数と切片を確認すると値が一致することが確認出来ました。

参考

最小二乗法の意味と計算方法 - 回帰直線の求め方 - sci-pursuit.com
最小二乗法(直線)の簡単な説明 | 高校数学の美しい物語

GitHub

https://github.com/mylde/ml-playground/blob/master/work/linear_regression.ipynb