2014-05-04 19 views
5

W tej chwili wdrażam powtarzalną sieć neuronową (RNN) o nazwie Echo State Network (ESN) w pythonie dla klasyfikacji szeregów czasowych (TSC).Równanie parametryczne z numpy

Chcę generować trajektorie za pomocą równań parametrycznych, a następnie trenować moją sieć neuronową, aby sklasyfikować te trajektorie, tak jak w tym artykule przez Mickael Hüsken & Peter Stagge, Recurrent Neural Networks for Time Series Classification. Na koniec chcę porównać wydajność mojego ESN i ich RNN.
Mam kłopoty z generowaniem jednej z tych trajektorii.

Oto trzy klasy zgodnie z tym artykułem:

enter image description here
Które powinny generować coś takiego: enter image description here

wygenerować 50 trajektorie każdej klasy, a to pływak przymocowany do 0,7, beta i t0 są wybierane losowo między 0 a 2 * pi. Trajektoria zawiera 30 punktów, więc czas jest równy (2 * pi)/30.

Oto mój kod, wiem, że to nie jest najbardziej pytoniczny sposób, ale spełnia on zadanie dla pierwszej i trzeciej klasy. Jednak druga klasa jest nadal na podsłuchu :(

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() 

Kiedy trajektorie fabuły drugiej klasy (przy użyciu matplotlib), mam dziwny efekt ... na przykład:

enter image description here

Odpowiedz

3

Drugie równanie wydaje mi się dziwne, a właściwie does not seem to produce the picture shown.

Patrząc na równania dla klas 1 i 3, łatwo jest odgadnąć równanie parametryczne, które dałoby postać z trzema "płatkami":

def class2(t, beta): 
    return alpha*np.sin(t+beta)*np.sin(3*t), alpha*np.cos(t+beta)*np.sin(3*t) 

Potem idzie:

for beta in [0, np.pi/3, np.pi/2]: 
    pylab.plot(*class2(np.linspace(0, np.pi, 100), beta), 
       label='$\\beta={:.3f}$'.format(beta)) 
pylab.legend() 

daje:

3-petals figure

+0

Dziękujemy! Po prostu poprawię swoje równanie zgodnie z twoim postem (dodaję współczynnik 1/2 do t, aby być jak najbliżej pierwotnego eksperymentu) :) – NiziL