1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

逆行列法による線形回帰をPyTorchで解く

Posted at

線形回帰はいろんな方法で行えますが、この記事では逆行列法(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()

逆行列法による線形回帰をPyTorchで解く_16_0.png

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?