私は現在、時系列分類 (TSC) のために Python でエコー状態ネットワーク (ESN) と呼ばれるリカレント ニューラル ネットワーク (RNN) を実装しています。
Mickael Hüsken と Peter Stagge による Recurrent Neural Networks for Time Series Classification の記事のように、パラメトリック方程式を使用して軌跡を生成し、ニューラル ネットワークをトレーニングしてこれらの軌跡を分類したいと考えています。最後に、ESN と RNN のパフォーマンスを比較したいと思います。
さて、私はこれらの軌道の 1 つの生成に問題があります。
この記事によると、次の 3 つのクラスがあります。
次のようなものが生成されます。
各クラスの 50 の軌跡を生成します。アルファは 0.7 に固定された float で、ベータと t0 は 0 から 2*pi の間でランダムに選択されます。軌跡には 30 個のポイントが含まれているため、タイムステップは (2*pi)/30 です。
これが私のコードです。これが最もpythonicな方法ではないことはわかっていますが、最初と3番目のクラスで機能します。ただし、2番目のクラスにはまだバグがあります:(
import numpy as np
import sys, getopt, random
timestep = 2.0*np.pi / 30.0
alpha = 0.7
def class1(t, beta):
return alpha*np.sin(t+beta)*np.abs(np.sin(t)), alpha*np.cos(t+beta)*np.abs(np.sin(t))
def class2(t, beta):
return alpha*np.sin(t/2.0+beta)*np.sin(3.0/2.0*t), alpha*np.cos(t+beta)*np.sin(2.0*t)
def class3(t, beta):
return alpha*np.sin(t+beta)*np.sin(2.0*t), alpha*np.cos(t+beta)*np.sin(2.0*t)
def generate():
clazz = {
'1' : class1,
'2' : class2,
'3' : class3
}
for classID in clazz :
for i in xrange(50):
fd = open("dataset/%s_%s"%(classID, i+1), 'w')
beta = 2*np.pi*np.random.random()
t = 2*np.pi*np.random.random()
for _ in xrange(30):
fd.write("%s %s\n"%clazz[classID](t, beta))
t += timestep
fd.close()
(matplotlib を使用して) 2 番目のクラスの軌跡をプロットすると、奇妙な結果が得られます。たとえば、次のようになります。