サムネがコーヒーの記事は書きかけです。

ANNsによる回帰【機械学習】

単純回帰

一つの変数によって目的変数を予測する単純な回帰は以下のように表されます。

$$y_i = \beta_0 + \beta_1 x_i + \epsilon_i$$

これをパーセプトロンを使って書くと、

$$\hat{y}_i = \sigma (w_0+\mathbf{x}^\mathrm{T}\mathbf{w})=\sigma (\mathbf{x}^\mathrm{T}\mathbf{w})$$

Pytorchでランダムプロットの生成

回帰用にtorchを使用してランダムプロットを生成します。

import numpy as np 
import torch 
import torch.nn as nn 
import matplotlib.pyplot as plt 

fig = plt.figure()

N = 30
x = torch.randn(N,1)
y = x + torch.randn(N,1)/2

plt.scatter(x,y)
plt.grid()
plt.xlabel("x")
plt.ylabel("y")
fig.savefig('a.png',dpi = 500)

回帰モデルの設定

今回はインプット層、アウトプット層は両方一つを受け取って一つを返す返す形なので、パラメータは1にしています。

ANNModel = nn.Sequential(
    nn.Linear(1,1),  # インプット層
    nn.ReLU(),       # 活性化関数
    nn.Linear(1,1)   # アウトプット層
    )

パラメータの設定

#学習率
lr = 0.05
#損失関数(最小二乗誤差)
L = nn.MSELoss()
#最適化
optimizer = torch.optim.SGD(ANNModel.parameters(),lr=lr)

学習

epochs = 500
#損失の初期化
losses = torch.zeros(epochs)

#学習
for i in range(epochs):
    #Forward pass
    Y_hat = ANNModel(x)

    #損失の計算
    loss = L(Y_hat,y)
    losses[i] = loss

    # Back propagation
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

predictions = ANNModel(x)

finalloss = (predictions-y).pow(2).mean()

勾配の収束の様子をプロット

plt.plot(losses.detach(),'o',markerfacecolor='w',linewidth=.1)
plt.plot(epochs,finalloss.detach(),'-o')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Final loss = %g' %finalloss.item())
plt.grid()
fig.savefig("a.png",dpi = 500)

学習結果を出力してみます。

plt.plot(x,y,'bo',label='Real data',color = "black")
plt.plot(x,predictions.detach(),'rs',label='Predictions',color ="red")
plt.title(f'r={np.corrcoef(y.T,predictions.detach().T)[0,1]:.2f}')
plt.legend()
fig.savefig("a.png",dpi = 500)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です