学習用データの作成
ニューラルネットワーク を試験運用するための簡単な学習用データを作成しておきます。入力データは
# In[7]
# ★★★ 座標データを作成 ★★★
x = np.linspace(-6, 6, 17)
y = np.linspace(-6, 6, 17)
xx, yy = np.meshgrid(x, y)
XX, YY = np.meshgrid(x, y)
# ★★★ 入力データの作成 ★★★
# 格子データを1次元配列に変換
x_in = xx.reshape(-1)
y_in = yy.reshape(-1)
# x_inとy_inを結合
data_in = np.vstack([x_in, y_in]).T
# ★★★ クラスデータの作成 ★★★
# 条件を設定
condition = YY >= XX**2 - 4
# クラスデータの1列目
# 条件を満たすデータを1に、満たさないデータを0に書き換える
XX[condition] = 1
XX[~condition] = 0
# クラスデータの2列目
# 条件を満たすデータを0に、満たさないデータを1に書き換える
YY[condition] = 0
YY[~condition] = 1
# 格子データを1次元配列に変換
X = XX.reshape(-1)
Y = YY.reshape(-1)
# one_of_Kのクラスデータ
data_c = np.vstack([X, Y]).T
In[7] について簡単に解説しておきます。numpy.meshgrid() で 2 セットの格子データを生成します。xx と yy は形状を 1 次元配列に変換した後で、numpy.vstack() で縦軸 (axis = 0) 方向に結合して入力データ data_in とします。放物線
と表せます。格子点データ XX と YY について、
condition = XX**2 + YY**2 <= 16
という条件式 condition を定義して、
XX[condition] = 1
で条件を満たすデータをすべて 1 に書き換えます。Python でブール値 (True または False) を反転させる演算子は「 ~ 」です。すなわち、~conditon は条件を満たさない(放物線の下側にある)ことを意味します。したがって、
XX[~condition] = 0
と記述すると、条件を満たさないデータは 0 に書き換えられます。これで、XX はクラスデータの 1 列目となりました。同様に YY を使ってクラスデータの 2 列目を作成します (YY は XX の 0 と 1 を反転させた配列です) 。XX と YY を 1 次元配列に変換して、numpy.vstack() で結合させると、正解値データの完成です。
XX[condition] = 1 で XX が書き換えられているのに、XX を含んだ condition を使って YY のデータを作成していいのかと不安になるかもしれません(私も少し不安になりました)が、condition には、この変数を定義したときの XX の状態が保存されているので問題ありません。念のために、データを平面にプロットして確認しておきましょう。
# In[8]
import matplotlib.pyplot as plt
# 放物線の上側にある座標
# クラスデータの1列目が1となっているデータを抽出
x1 = data_in[data_c[:,0] == 1][:, 0]
y1 = data_in[data_c[:,0] == 1][:, 1]
# 放物線の下側にある座標
# クラスデータの1列目が0となっているデータを抽出
x2 = data_in[data_c[:,0] == 0][:, 0]
y2 = data_in[data_c[:,0] == 0][:, 1]
# 正解データをプロット
fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot(111)
ax.set_xlabel("x", size = 15, labelpad = 10)
ax.set_ylabel("y", size = 15, labelpad = 10)
ax.set_xlim([-6, 6])
ax.set_ylim([-6, 6])
ax.scatter(x1, y1, marker = "D", color = "darkorange")
ax.scatter(x2, y2, marker = "+", color = "darkblue"
次回記事のニューラルネットワーク試験運用では、このデータを使います。
コメント