### Sine training example for ffnet ###
from ffnet import ffnet
from math import pi, sin, cos
# Let's define network connectivity by hand:
conec = [(1, 2), (1, 3), (1, 4), (1, 5), (2, 6), (3, 6), (4, 6), (5, 6), \
(0, 2), (0, 3), (0, 4), (0, 5), (0, 6)]
# Note 1: Biases in ffnet are handled as the connections
# from special node numbered 0. Input nodes cannot be biased.
# Note 2: Node numbering and order of links in conec is meaningless,
# but the connections have to be from source to target.
# Note 3: The same connectivity can be obtained using mlgraph function
# provided with ffnet (layered architecture (1,4,1)).
# Network creation
net = ffnet(conec)
# Generation of training data (sine values for x from 0 to 2*pi)
patterns = 16
input = [ [ 0. ] ] + [ [ k*2*pi/patterns ] for k in xrange(1, patterns + 1) ]
target = [ [ sin(x[0]) ] for x in input ]
# Training network
#first find good starting point with genetic algorithm (not necessary, but may be helpful)
print "FINDING STARTING WEIGHTS WITH GENETIC ALGORITHM..."
net.train_genetic(input, target, individuals=20, generations=500)
#then train with scipy tnc optimizer
print "TRAINING NETWORK..."
net.train_tnc(input, target, maxfun = 5000, messages=1)
# Testing network
print
print "TESTNG NETWORK..."
output, regression = net.test(input, target, iprint = 2)
#################
# Make some plots
try:
from pylab import *
points = 128
xaxis = [ 0. ] + [ k*2*pi/points for k in xrange(1, points + 1) ]
sine = [ sin(x) for x in xaxis ]
cosine = [ cos(x) for x in xaxis ]
netsine = [ net([x])[0] for x in xaxis]
netcosine = [ net.derivative([x])[0][0] for x in xaxis ]
subplot(211)
plot(xaxis, sine, 'b--', xaxis, netsine, 'k-')
legend(('sine', 'network output'))
grid(True)
title('Outputs of trained network.')
subplot(212)
plot(xaxis, cosine, 'b--', xaxis, netcosine, 'k-')
legend(('cosine', 'network derivative'))
grid(True)
show()
except ImportError:
print "Cannot make plots. For plotting install matplotlib..."