

機械学習初心者です。  
sin波を機械学習で予想させようと思い、下記サイトを参考にプログラムを組んでみました。  
<https://www.ai-lab.app/169/>  
発展として、周期を連続的に予測させようと思いました。  
方法としては次の値を予想させるために前5個分のデータを読み込ませて予想している感じです。そのようにプログラムしているつもりです。

まずは2周期目だけ予想させようと思ったのですが、最初の部分がうまく連続的になりません。  
図はわかりにくいですが、1周期と2周期を重ねたものです。  
すぐ後は連続的になっているので最初の部分も連続的にできるとは思うのですがいかがでしょう。  
また、予想の一個目が下がるのではなく上がっているのも気になります。（おそらく横につなげていったら一個目が不自然に上がる。）  
どのようにすれば連続的になるか、ご教示願えればと思います。  
よろしくお願いいたします。

[code]

    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    
    # === 3-a. データの作成 ===
    x = np.linspace(-np.pi, np.pi).reshape(-1, 1)
    #つなぎ目部分を学習させるために6周期分にする
    for i in range(5):
        x = np.append(x , x)
        t = np.sin(x)
    
    # === 3-b. モデルの作成 ===
    # パラメータを設定
    batch_size = 8 # バッチサイズ
    n_in = 1 # 入力層のニューロン数
    n_mid = 20 # 中間層のニューロン数
    n_out = 1 # 出力層のニューロン数
    
    # ニューラルネットワークのモデルを生成
    model = Sequential()
    model.add(Dense(n_mid, input_shape=(n_in,), activation="sigmoid"))
    model.add(Dense(n_out, activation="linear"))
    model.compile(loss="mean_squared_error", optimizer="sgd")
    print(model.summary())
    
    # === 3-c. モデルの学習 ===
    history = model.fit(x, t, batch_size=batch_size, epochs=2000, validation_split=0.1)
    
    # === 3-d. 学習推移の可視化 ===
    loss_train = history.history['loss']
    loss_val = history.history['val_loss']
    
    plt.plot(np.arange(len(loss_train)), loss_train, label="loss_train")
    plt.plot(np.arange(len(loss_val)), loss_val, label="loss_val")
    plt.legend()
    plt.show()
    
    print(len(x))
    #予測
    for i in range(20):
        x_train, x_test = train_test_split(x, test_size=5, shuffle = False)
        r = model.predict( x_test )
        t = np.append(t, r[4])
        x = np.append(x , x[i + 1])
    
    # === 3-e. sin波の予測 ===
    print(x)
    #plt.plot(x, model.predict(x))
    plt.plot(x, t)
    plt.show()
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/8a8MC.png)](https://i.stack.imgur.com/8a8MC.png)


CC BY-SA 4.0
2021-06-06T06:54:33.293
77364
2021-06-07T02:57:00.980
2021-06-06T07:33:21.630
45645
45645
question
python 機械学習 keras
機械学習でsin波を学習させた際のずれについて


まず単純に6周期分の学習データで、f=sin(x)を学習する場合、[-π, 11π]のxについてのsin(x)のを作れば良いので

[code]

    x = np.linspace(-np.pi, np.pi * 11,num=50*6).reshape(-1, 1)
    t = np.sin(x)
    
[/code]

のようにすると6周期の範囲のxを生成できます。

ですが、本当にプロットされているような図を学習したい場合、xは入力ではなく予測対象になりますし、yもy=sin(x)のようなxの値で一意に決まる単純な関数として表せません。  
この場合、時間tに対して、xが-πから πを往復し、yがsin(x)になるような、x=f(t)とy=g(t)を同時に学習する必要があるかと思います。


CC BY-SA 4.0
2021-06-07T02:57:00.980
77375
2021-06-07T02:57:00.980
241
77364
answer