線形回帰はいろんな方法で行えますが、この記事では逆行列法(inverse matrix method)を PyTorch で実装してみます。
逆行列法(inverse matrix method)
逆行列法については、たとえばこちらを参照していただくと解説があります(Tensorflowによる実装もあります)。
PyTorch による逆行列法
必要なライブラリのインポート
import matplotlib.pyplot as plt
import numpy as np
import torch
PyTorchの基礎は、たとえばこちら。
データを作成します。
x_vals = np.linspace(0, 10, 100)
y_vals = x_vals + np.random.normal(0, 1, 100)
逆行列法に用いる行列を作成します。
# xデータの列と1の列から成る行列Aを作成
x_vals_column = np.transpose(np.matrix(x_vals))
ones_column = np.transpose(np.matrix(np.repeat(1, 100)))
A = np.column_stack((x_vals_column, ones_column))
# yデータの行列bを作成
b = np.transpose(np.matrix(y_vals))
テンソルに変換します
# テンソルを作成
A_tensor = torch.from_numpy(A).float()
b_tensor = torch.from_numpy(b).float()
行列の準備が整ったところで、行列方程式を逆行列法で解きます。
# 逆行列法を適用
tA_A = torch.matmul(torch.transpose(A_tensor, 0, 1), A_tensor)
tA_A_inv = torch.inverse(tA_A)
product = torch.matmul(tA_A_inv, torch.transpose(A_tensor, 0, 1))
solution = torch.matmul(product, b_tensor)
tensor([[ 1.0362],
[-0.2767]])
傾きと切片を得ます。
# 係数を抽出
slope = solution[0][0]
y_intercept = solution[1][0]
slope, y_intercept
(tensor(1.0362), tensor(-0.2767))
回帰直線を得ます。
# 回帰直線
best_fit = []
for i in x_vals:
best_fit.append(slope * i + y_intercept)
結果をプロットします。
# 結果をプロット
plt.scatter(x_vals, y_vals, label="data")
plt.plot(x_vals, best_fit, label="fitted line")
plt.legend()
plt.show()