機械学習

重回帰分析を行うデータから重回帰式を算出するクラスを作成してみた

以下の記事で、\(\boldsymbol{\hat y} = X \boldsymbol w\)の最適解は、\(\boldsymbol w = ({}^t \!XX)^{-1}\boldsymbol {}^t \! X \boldsymbol y\)であることを紹介している。

重回帰分析を行うデータから重回帰式を算出してみた 以下の記事で読み込んだデータを元に、住宅価格の最適解を求めることを考える。 https://www.purin-it.com/...

今回は、上記計算式を利用して、重回帰式の算出を行うクラスを作成してみたので、そのサンプルプログラムを共有する。

\(\boldsymbol w = ({}^t \!XX)^{-1}\boldsymbol {}^t \! X \boldsymbol y\)を計算することで、重回帰式の最適解を算出するクラスの内容は、以下の通り。

import numpy as np
import pandas as pd

class OrigMultiRegressionLine:
    
    # クラス変数
    w = np.array([])
    
    # 初期化処理
    def __init__(self):
        pass

    # 与えられた入力データから、目的関数y=Xwのwを算出する
    def fit(self, data_x, data_y):
        # 入力データdata_xの先頭に、バイアス(1)を追加
        x_df = pd.DataFrame(data_x)
        x_df.insert(0, 'bias', 1)
        
        # データをNumpy.ndarrayに変換し、計算に使うX,yを算出
        X = x_df.values
        y = data_y
        
        # 目的関数y=Xwのwを算出
        XtX = np.dot(X.T, X)
        XtX_Inv = np.linalg.inv(XtX)
        Xty = np.dot(X.T, y)
        self.w = np.dot(XtX_Inv, Xty)
    
    # 目的関数y=Xwのwを出力する
    def printw(self):
        # 小数点以下3桁まで+指数表記しない形式に設定後、wを出力
        np.set_printoptions(precision=3, suppress=True)
        print(self.w)
    
    # 与えられた入力データxから、yの最適解を返却する
    def predict(self, data_x):
        return np.dot(self.w[1:], data_x) + self.w[0]

また、上記OrigMultiRegressionLineクラスのfit・printwメソッドを呼び出して、目的関数\(\boldsymbol{\hat y} = X \boldsymbol w\)の\(\boldsymbol w\)を出力した結果は、以下の通り。

import numpy as np
from sklearn.datasets import fetch_california_housing

# カリフォルニアの住宅価格データセットを取得
housing = fetch_california_housing()

# 住宅価格データセットのデータをX, 結果をyとする
X = housing.data
y = housing.target

# OrigMultiRegressionLineクラスを使って、目的関数y=Xwのwを算出する
omr = OrigMultiRegressionLine()
omr.fit(X, y)
print("*** 目的関数y=Xwのwの値 ***")
omr.printw()
重回帰式の最適解を算出するクラスのfit・printwメソッド呼出



削除または保存していないWordドキュメントの復元方法【4DDiG Windowsデータ復元】ワード(Word)データ等のファイルを誤って削除してしまった場合は、通常はデータの復元ができませんが、4DDiGというソフトウェアを利用...

さらに、上記OrigMultiRegressionLineクラスのpredictメソッドを呼び出して、目的関数\(\boldsymbol{\hat y} = X \boldsymbol w\)の最適解\(\boldsymbol{\hat y}\)を出力した結果は、以下の通り。

import numpy as np
from sklearn.datasets import fetch_california_housing

# カリフォルニアの住宅価格データセットを取得
housing = fetch_california_housing()

# 住宅価格データセットのデータをX, 結果をyとする
X = housing.data
y = housing.target

# OrigMultiRegressionLineクラスを使って、目的関数y=Xwのwを算出する
omr = OrigMultiRegressionLine()
omr.fit(X, y)
print("*** 目的関数y=Xwのwの値 ***")
omr.printw()
print()

# 先頭3件のデータx_data, 結果y_data, 目的関数wから算出した結果y_hatを出力する
print("*** 目的関数y=Xwから算出した結果 ***")
for idx in range(3):
    print(" *** x_data[{0}]の値 ***".format(idx))
    x_data = X[idx]
    print(x_data)
    print(" *** y_data[{0}]の値 ***".format(idx))
    y_data = y[idx]
    print(y_data)
    print(" *** y_hat[{0}]の値 ***".format(idx))
    print(omr.predict(x_data))
    print()
重回帰式の最適解を算出するクラスのfit・printw・predictメソッド呼出

要点まとめ

  • \(\boldsymbol{\hat y} = X \boldsymbol w\)の最適解は、\(\boldsymbol w = ({}^t \!XX)^{-1}\boldsymbol {}^t \! X \boldsymbol y\)であることを利用すると、重回帰式を算出できる。