import joblib
import numpy as np
import torch
import torch.nn as nn


X_train = joblib.load('ch08/X_train.joblib')
X_train = torch.from_numpy(X_train.astype(np.float32)).clone()

X = X_train[0:4]

net = nn.Sequential(nn.Linear(X.size()[1], 4), nn.Softmax(1))
y_pred = net(X)
print(y_pred)
pythonを用いて、以下の行列を読み込み、学習データについて以下の計算を実行せよ。

$$
\hat{\boldsymbol{y}}_1 = {\rm softmax}(\boldsymbol{x}_1 W), \\
\hat{Y} = {\rm softmax}(X_{[1:4]} W)
$$

ただし、$${\rm softmax}$$はソフトマックス関数、$$X_{[1:4]} \in \mathbb{R}^{4 \times d}$$は特徴ベクトル$$\boldsymbol{x}_1, \boldsymbol{x}_2, \boldsymbol{x}_3, \boldsymbol{x}_4$$を縦に並べた行列である。

$$
X_{[1:4]} = \begin{pmatrix} 
  \boldsymbol{x}_1 \\ 
  \boldsymbol{x}_2 \\ 
  \boldsymbol{x}_3 \\ 
  \boldsymbol{x}_4 \\ 
\end{pmatrix}
$$

行列$$W \in \mathbb{R}^{d \times L}$$は単層ニューラルネットワークの重み行列で、ここではランダムな値で初期化すればよい（問題73以降で学習して求める）。なお、$$\hat{\boldsymbol{y}}_1 \in \mathbb{R}^L$$は未学習の行列$$W$$で事例$$x_1$$を分類したときに、各カテゴリに属する確率を表すベクトルである。
同様に、$$\hat{Y} \in \mathbb{R}^{n \times L}$$は、学習データの事例$$x_1, x_2, x_3, x_4$$について、各カテゴリに属する確率を行列として表現している。

+ 学習データの特徴量行列: $$X_{\rm train} \in \mathbb{R}^{N_t \times d}$$
+ 学習データのラベルベクトル: $$Y_{\rm train} \in \mathbb{N}^{N_t}$$
+ 検証データの特徴量行列: $$X_{\rm valid} \in \mathbb{R}^{N_v \times d}$$
+ 検証データのラベルベクトル: $$Y_{\rm valid} \in \mathbb{N}^{N_v}$$
+ 評価データの特徴量行列: $$X_{\rm test} \in \mathbb{R}^{N_e \times d}$$
+ 評価データのラベルベクトル: $$Y_{\rm test} \in \mathbb{N}^{N_e}$$