Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

重回帰分析の基本

Last updated at Posted at 2024-07-27

重回帰分析の計算

以下の数式で、重回帰分析の計算を行うことができる。$w$は重みベクトルといい、各説明変数の影響度を表す。これは、予測したい情報に対して、与えられる各変数がその予測結果にどの程度の大きさの影響を与えるのかを判断するための値となる。
$$w = (X^TX)^{-1}X^Ty$$
この数式を計算していくためには、以下のステップに則って、計算していく必要がある。試しにやってみればわかるが、手で計算することもできるが、非常に計算が面倒であることがわかると思う。
$$ステップ1: X^TX              $$

$$ステップ2: (X^TX)^{-1}            $$

$$ステップ3: X^Ty              $$

$$ステップ4: w = (X^TX)^{-1}X^Ty       $$

$$ステップ5: \hat{y} = w_{1}x_{1} + w_{2}x_{2} + ... + w_{n}x_{n} + b$$

入力値(サンプル)

X = np.array([
    [1,2,3],
    [1,2,5],
    [1,3,4],
    [1,5,9]
])
X
y = np.array([
    [1],
    [5],
    [6],
    [8]
])
y

numpyをインストール

試す事前に、numpyをインストールしておく。

import numpy as np

ステップ1

XtX = np.dot(X.T, X)
XtX
結果
array([[  4,  12,  21],
       [ 12,  42,  73],
       [ 21,  73, 131]])

ステップ2

XtX_inv = np.linalg.inv(XtX)
XtX_inv
結果
array([[ 1.76530612, -0.39795918, -0.06122449],
       [-0.39795918,  0.84693878, -0.40816327],
       [-0.06122449, -0.40816327,  0.24489796]])

ステップ3

Xty = np.dot(X.T, y)
Xty
結果
array([[ 20],
       [ 70],
       [124]])

ステップ4

w = np.dot(XtX_inv, Xty)
w
結果
array([[-0.14285714],
       [ 0.71428571],
       [ 0.57142857]])

ステップ5

以上のステップを踏むことで、各変数の重み$w$(各変数がどの程度の大きさの影響を受けるか)が出せるようになり、最終的に予測モデルを次のように求めることができるようになる。

$$\hat{y} = w_{1}x_{1} + w_{2}x_{2} + ... + w_{n}x_{n} + b$$

ここまでのステップを踏むことで、重み$w$をもとに、モデルを学習をさせたり、予測することができるようになる。つまり、それらを独自に実装しようとすると、先ほどの計算ステップを見てもわかる通り、非常に面倒な作業が必要となってくる。それらを簡単に済ませるようにするためのライブラリが、Scikt-learnとしてPythonで提供されている。

Scikit-learn

幅広い機械学習モデルをカバーしてしているライブラリ。ステップ1〜5を実施してみてもわかる通り、計算が面倒かつ時間が掛かってしまう。さらに、そこから予測値を推測するための計算も行わなければならないので、このライブラリを使用することが一般的となっている。

ここでやっていることとしては、LinearRegressionのインスタンス化(どういったアルゴリズムで予測モデルを構築するか)、選択したアルゴリズムで予測モデルを構築する、予測してみる。(実際には、他にも色々とやるべきことがあるらしいが、ここではこの3つのみ)

Scikit-learnのインストール & バージョン確認

import sklearn
sklearn.__version__
結果
1.2.2

学習&重みベクトルの算出

この操作によって、生のデータをもとに学習が行われ、モデルを作ることができる。

from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=False) #モデルの宣言
model.fit(X, y) #モデルの学習
model.coef_ #調整後のパラメータwの確認
結果
array([[-0.14285714,  0.71428571,  0.57142857]])

この結果は、ステップ4の重みベクトル$w$と同じ結果となっている。sklearnを用いれば、ステップ1〜4を簡単に処理することができ、簡単にモデルを構築することができるようになる。

予測

x_new = np.array([[1, 3, 6]]) #入力値
y_pred = model.predict(x_new) #予測
y_pred
結果
array([[5.42857143]])

学習済のモデルをもとに、予測することが可能となる。

補足事項

ベクトル

x = np.array([[1],[2],[3]])
x
結果
array([[1],
       [2],
       [3]])
x.shape
結果
(3, 1)  ・・・・ 3行1列

行列

X = np.array([[1, 2],[3, 4]])
結果
array([[1, 2],
       [3, 4]])

転置

Xt = X.T
Xt
結果
array([[1, 3],
       [2, 4]])

逆行列

X_inv = np.linalg.inv(X)
X_inv
結果
array([[-2. ,  1. ],
       [ 1.5, -0.5]])

行列積

XX_inv = np.dot(X, X_inv)
XX_inv
結果
array([[1.0000000e+00, 0.0000000e+00],
       [8.8817842e-16, 1.0000000e+00]])

その他

B = np.array([
            [1, 2, 3],
            [2, 3, 4]
    ])
row, col = B.shape
結果
2行
3列
for b in B:
  print(b)
  print('-------')
結果
[1 2 3]
-------
[2 3 4]
-------
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?