

Henon写像のESN学習を行なっているのですが上記のエラーが起こってしまいます。  
エラーの箇所は予測性能評価の部分で起こっていると思うのですが原因がわかりません。  
よろしければ回答の程をお願いします。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    from model import ESN, Tikhonov
    
    
    np.random.seed(seed=0)
    
    # Henon写像によるデータ生成
    class Henon:
        # パラメータの指定
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
        def f1(self, t, x, y):
            return 1 - self.a*x**2 + y
    
        def f2(self, t, x, y):
            return self.b*x
    
    
        def Henon(self, t, X):
            '''
            :param t: 時間
            :param X: 2次元ベクトル
            :return: 2次元ベクトル
            '''
            next_X = [self.f1(t, X[0], X[1]), 
                      self.f2(t, X[0], X[1])]
            return np.array(next_X)
    
    
        def Date_Henon(self, x0, T, dt):
            '''
            :param x0: 初期値
            :param T: 時間
            :param dt: ステップ幅
            :return: Henon写像
            '''
            X = x0
            t = 0
            data = []
    
            while t < T:
                next_X =  self.Henon(t,X)
                data.append(next_X)
                X = next_X
                t = t + dt
    
            return np.array(data)
    
    if __name__ == '__main__':
    
        # Lorenz方程式から時系列データ生成
        T_train = 1000  # 学習データの長さ
        T_test = 100# テストデータの長さ
        dt = 1.0
        x0 = np.array([1, 1])  # 初期値
        
        dynamics = Henon(1.4, 0.3)
        data = dynamics.Date_Henon(x0, T_train + T_test, dt)
    
        # 訓練・検証用情報
        train_U = data[:T_train]
        train_D = data[1:T_train+1]
    
        test_U = data[T_train:T_train + T_test]
        test_D = data[1 + T_train:T_train + T_test + 1]
        
        N_x = 1000  # リザバーのノード数
        model = ESN(train_U.shape[1], train_D.shape[1], N_x, \
                    density=0.1, input_scale=0.1, rho=0.95)
    
        # 学習(リッジ回帰)
        train_Y = model.train(train_U, train_D, 
                              Tikhonov(N_x, train_D.shape[1], 1e-4))
    
        # モデル出力（自律系のフリーラン）
        test_Y = model.predict(test_U)
        T0 = test_D[:, 0]
        T1 = test_Y[:, 0]
        plt.plot(T0,label= 'テストデータ')
        plt.plot(T1)
    
    
        # 予測性能評価（valid time）
        eps = 1  # 許容誤差
        for n in range(int(T_test/dt)):
            dif = np.sqrt(((test_D[n,:] - test_Y[n,:]) ** 2).mean())
            if dif > eps:
                valid_time = float(n)*dt
                break
    
        print('valid time = ', valid_time)
    
[/code]


CC BY-SA 4.0
2022-10-02T19:17:30.770
91405
2022-10-23T14:48:19.557
54665
question
python
index 99 is out of bounds for axis 0 with size 99


既に解決済みかもしれませんが，念のため回答いたします。  
コメント欄のアドバイスに従い，68行目

[code]

    test_D = data[1 + T_train:T_train + T_test + 1]
    
[/code]

の直後に

[code]

    print(test_D.shape, data.shape)
    
[/code]

を挿入して調べてみると

[code]

    (99, 2) (1100, 2)
    
[/code]

が得られるので， test_D の（ axis 0 の）サイズが 99 であり，これがエラーの原因と考えられます。  
なお，68行目の記述を実際の数値（ T_train=1000, T_test=100 ）で置き換えてみると

[code]

    test_D = data[1001:1101]
    
[/code]

なので， test_D のサイズを 100 にするには，data のサイズが 1101 必要です。


CC BY-SA 4.0
2022-10-16T05:56:45.107
91626
2022-10-23T14:48:19.557
2022-10-23T14:48:19.557
54588
54588
91405
answer