asunasota
@asunasota

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

標準化・正規化の仕方が分からない

解決したいこと

以下のRNNに用いるデータを標準化・正規化をしたいのだがうまくできない。どこを改善すればよいか。

発生している問題・エラー

batch_size = 15  # バッチサイズ
n_in = 12 # 入力層のニューロン数
n_mid = 20  # 中間層のニューロン数
n_out = 1  # 出力層のニューロン数
target = 0

dataset= np.column_stack((y_2t,y_1t,y_8t,y_9t,y_10t,y_11t,y_12t,y_13t,y_14t,y_15t,y_16t,y_17t)).reshape(-1,n_in)
# 標準化のクラスを定義
scaler = StandardScaler()
train_x = dataset[0:-42,:]
test_x = dataset[-42:-18,:]
train_X = scaler.fit_transform(train_x)
test_X = scaler.fit_transform(test_x)

n_rnn = 12  # 時系列の数
n_sample = len(train_x)-n_rnn  # サンプル数
i_data = np.zeros((n_sample, n_rnn,n_in))  # 入力
c_data = np.zeros((n_sample, n_rnn,1))  # 正解

for i in range(0,n_sample):
    i_data[i] = train_x[i:i+n_rnn,:]
    c_data[i] = train_x[i+1:i+n_rnn+1,target].reshape(-1, 1)  # 時系列を入力よりも一つ後にずらす


n_sample2 = len(test_x)-n_rnn
i_data2 = np.zeros((n_sample2, n_rnn,n_in))
c_data2 =np.zeros((n_sample2, n_rnn,1))

for i in range(0,n_sample2):
    i_data2[i] = test_x[i:i+n_rnn,:]
    c_data2[i] = test_x[i+1:i+n_rnn+1,target].reshape(-1, 1)

i_data = i_data.reshape(n_sample, n_rnn, n_in)  # KerasにおけるRNNでは、入力を(サンプル数、時系列の数、入力層のニューロン数)にする
c_data = c_data.reshape(n_sample, n_rnn, 1)  # 今回は入力と同じ形状

# モデルの設計

model = keras.Sequential()
# SimpleRNN層の追加。return_sequenceをTrueにすると、時系列の全てのRNN層が出力を返す。
# return_sequenceをTrueをFalseにすると、最後のRNN層のみが出力を返す。
model.add(SimpleRNN(n_mid, input_shape=(n_rnn, n_in), return_sequences=True))
model.add(Dense(n_out, activation="linear"))

model.compile(loss="mean_squared_error", optimizer="sgd")  # 誤差は二乗誤差、最適化アルゴリズムはSGD

history = model.fit(i_data, c_data, epochs=100, batch_size=batch_size)

predictions = model.predict(i_data2)
#predictions = ms.inverse_transform(predictions_o).reshape(-1,n_rnn,1)


# 日付の抽出(観測値と計算値の数に一致する部分のみ使用)
date_labels_train = dates[1:-42]
date_labels_test = dates[-42+n_rnn:-18]

# 予測結果と実測値のプロット
plt.plot(date_labels_test, y_1t[-42+n_rnn:-18,:], label='kansoku')
plt.plot(date_labels_test, predictions[:,-1,0].flatten(), label='Predictions')
#plt.plot(date_labels_test, y_15[-42:-18], label='keisan')
plt.title('True Values vs Predictions')
plt.legend()
plt.xticks(rotation=45)  # 日付ラベルを回転して表示
plt.tight_layout()
plt.ylabel('(μgC/l)')

plt.show()


0

1Answer

まず標準化と正規化の違いから理解した方がよろしいかと
https://qiita.com/oki_kosuke/items/02ec7bee92c85cf10ac2
例えばこの記事など
「標準化・正規化をしたい」ということはおそらくなく
標準化か正規化のどちらかが求められているのかと
どちらかが決まればPythonコードは世に溢れていますし、ここで質問いただければ回答もできます

0Like

Your answer might help someone💌