2014-05-04 8 views
5

Attualmente sto implementando una rete neurale ricorrente (RNN) chiamata Echo State Network (ESN) in python per la classificazione delle serie temporali (TSC).Equazione parametrica con numpy

Voglio generare traiettorie mediante equazioni parametriche, quindi formare la rete neurale per classificare queste traiettorie, come in questo articolo per Mickael Hüsken & Peter Stagge, Recurrent Neural Networks for Time Series Classification. Infine, voglio confrontare le prestazioni tra il mio ESN e il loro RNN.
Beh, sono nei guai con la generazione di una di queste traiettorie.

Ecco le tre classi secondo l'articolo:

enter image description here
che dovrebbe generare qualcosa di simile: enter image description here

I generare 50 traiettorie di ogni classe, alfa è un galleggiante fisso a 0,7, beta e t0 sono scelti a caso tra 0 e 2 * pi. Una traiettoria contiene 30 punti, quindi il timestep è (2 * pi)/30.

Ecco il mio codice, so che non è il modo più poderoso, ma fa il lavoro per la prima e la terza classe. Tuttavia, la seconda classe è ancora ostacolato :(

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

Quando ho traiettorie trama della seconda classe (utilizzando matplotlib), ho un risultato strano ... per esempio:

enter image description here

risposta

3

La seconda equazione mi sembra strana, e in effetti does not seem to produce the picture shown.

Osservando le equazioni per le classi 1 e 3, è facile indovinare un'equazione parametrica che produrrebbe una figura con tre "petali":

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

Poi fare:

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

dà:

3-petals figure

+0

Grazie! Ho appena aggiustato la mia equazione in base al tuo post (aggiungo un fattore 1/2 a t per essere il più vicino possibile dell'esperimento originale) :) – NiziL