 |
Forecasting time series using Joone neural network
Source code name: "joone_timeseries.py"
Programming language: Python
Topic: Artificial Intelligence/neural net
DMelt Version 1.4. Last modified: 07/31/1971. License: Pro
https://datamelt.org/code/cache/joone_timeseries_8306.py
To run this script using the DMelt IDE,
copy the above URL link to the menu [File]→[Read script from URL] of the DMelt IDE.
from org.joone.engine import NeuralNetListener,TanhLayer,DelayLayer
from org.joone.engine import SigmoidLayer,FullSynapse,Monitor
from org.joone.io import FileInputSynapse,FileOutputSynapse
from org.joone.engine.learning import TeachingSynapse
from org.joone.net import NeuralNet
from java.lang import System
from java.io import *
from jhplot import *
from java.awt import *
import math
from java.util import Random
class joone(NeuralNetListener):
mills=0
epochs=1000
fileName=""
nnet = NeuralNet()
input = DelayLayer()
hidden = SigmoidLayer()
output = TanhLayer()
# a function to help connect layers
def connect(self,layer1, syn, layer2):
layer1.addOutputSynapse(syn)
layer2.addInputSynapse(syn)
def createDataSet(self,fileName,firstRow, lastRow, advColSel):
fInput = FileInputSynapse()
fInput.setInputFile(File(fileName))
fInput.setFirstRow(firstRow)
fInput.setLastRow(lastRow)
fInput.setAdvancedColumnSelector(advColSel)
return fInput
def createNet(self,fileName,epochs,trainingPatterns,temporalWindow):
self.epochs=epochs
print "Running NN for ", epochs, " epochs"
self.fileName=fileName
self.input.setTaps(temporalWindow-1)
self.input.setRows(1)
self.hidden.setRows(15)
self.output.setRows(1)
self.connect(self.input,FullSynapse(), self.hidden)
self.connect(self.hidden,FullSynapse(), self.output)
self.input.addInputSynapse(self.createDataSet(self.fileName, 1, trainingPatterns, "1"))
trainer = TeachingSynapse()
trainer.setDesired(self.createDataSet(self.fileName, 2, trainingPatterns+1, "1"))
self.output.addOutputSynapse(trainer)
self.nnet.addLayer(self.input, NeuralNet.INPUT_LAYER)
self.nnet.addLayer(self.hidden, NeuralNet.HIDDEN_LAYER)
self.nnet.addLayer(self.output, NeuralNet.OUTPUT_LAYER)
self.mills = System.currentTimeMillis()
self.nnet.randomize(0.5)
def train(self):
mon = self.nnet.getMonitor()
mon.setLearningRate(0.2)
mon.setMomentum(0.7)
mon.setTrainingPatterns(trainingPatterns)
mon.setTotCicles(epochs)
mon.setPreLearning(temporalWindow)
mon.setLearning(True)
mon.addNeuralNetListener(self)
self.nnet.start()
mon.Go()
self.nnet.join()
def interrogate(self,outputFile):
mon = self.nnet.getMonitor()
self.input.removeAllInputs()
startRow = trainingPatterns - temporalWindow
self.input.addInputSynapse(self.createDataSet(self.fileName, startRow+1, startRow+40, "1"))
self.output.removeAllOutputs()
fOutput = FileOutputSynapse()
fOutput.setFileName(outputFile)
self.output.addOutputSynapse(fOutput)
mon.setTrainingPatterns(40)
mon.setTotCicles(1)
mon.setLearning(False)
self.nnet.start()
mon.Go()
self.nnet.join()
def netStopped(self,e):
mon =e.getSource()
if (mon.isLearning()):
epoch = mon.getTotCicles() - mon.getCurrentCicle()
print "Epoch:",epoch," last RMSE=",mon.getGlobalError()
else:
delay = System.currentTimeMillis() - self.mills
print "Training finished after ",delay," ms"
def cicleTerminated(self,e):
mon = e.getSource()
epoch = mon.getTotCicles() - mon.getCurrentCicle()
if ((epoch > 0) and ((epoch % 100) == 0)):
print "Epoch:",epoch," RMSE=",mon.getGlobalError()
def netStarted(self,e):
pass
def errorChanged(self,e):
pass
def netStoppedError(self,e):
pass
r=Random()
print "Create a file joone_timeseries.txt with time series cos(x)*sin(x)+noise"
f = open("joone_timeseries.txt", "w")
for x in range(0,1000):
yEst = 0.9*math.cos(x*0.4)*math.sin(0.7*x)+0.02*r.nextGaussian() # cos(x*0.3)*sim(x)+noise
f.write( str(yEst) + "\n" )
f.close()
# get input file with TimeSeries
fileName = "joone_timeseries.txt"
print "Downloading .. "+fileName
# Web.get("http://datamelt.org/examples/data/"+fileName)
trainingPatterns = 200
epochs = 10000
temporalWindow = 20
c1 = HPlot("show data")
c1.visible()
c1.setRangeX(0,1100)
c1.setNameX("time")
c1.setNameY("price")
c1.setMarginLeft(90)
# show data
dataIN = [line.strip() for line in open(fileName, 'r')]
print "Total data size=",len(dataIN), " For learning=",trainingPatterns
p1=P1D("Time series")
p1.setDrawLine(True)
p1.setPenWidth(1)
for i in range(len(dataIN)):
p1.add(i,float(dataIN[i]))
c1.draw(p1)
# run NN for predictions
ts=joone()
ts.createNet(fileName,epochs,trainingPatterns,temporalWindow)
print "Training..."
ts.train()
ts.interrogate("results1.txt")
ts.interrogate("results2.txt")
# show predictions
data = [line.strip() for line in open("results2.txt", 'r')]
p2=P1D("Prediction")
p2.setColor(Color.red)
p2.setDrawLine(True)
for i in range(len(data)):
p2.add(len(dataIN)+i,float(data[i]))
c1.draw(p2)
print "Done."
You see the box below because you did not login.