예제 #1
0
def trainAndGetError(size, spectralRadius, inputScaling, reservoirScaling,
                     leakingRate, initialTransient, trainingInputData,
                     trainingOutputData, inputWeightMatrix,
                     reservoirWeightMatrix, validationOutputData, horizon,
                     testingActualOutputData):

    # Error function
    errorFun = metrics.MeanSquareError()

    # Train
    network = ESN.Reservoir(size=size,
                            spectralRadius=spectralRadius,
                            inputScaling=inputScaling,
                            reservoirScaling=reservoirScaling,
                            leakingRate=leakingRate,
                            initialTransient=initialTransient,
                            inputData=trainingInputData,
                            outputData=trainingOutputData,
                            inputWeightRandom=inputWeightMatrix,
                            reservoirWeightRandom=reservoirWeightMatrix)
    network.trainReservoir()

    warmupFeatureVectors, warmTargetVectors = formFeatureVectors(
        validationOutputData)
    predictedWarmup = network.predict(warmupFeatureVectors[-initialTransient:])

    initialInputSeedForTesing = validationOutputData[-1]

    predictedOutputData = predictFuture(network, initialInputSeedForTesing,
                                        horizon)[:, 0]

    # Calculate the error
    error = errorFun.compute(testingActualOutputData, predictedOutputData)
    return error
예제 #2
0
    def __reservoirTrain__(self, x):

        #Extract the parameters
        spectralRadius = x[0]
        inputScaling = x[1]
        reservoirScaling = x[2]
        leakingRate = x[3]

        #Create the reservoir
        res = classicESN.Reservoir(
            size=self.size,
            spectralRadius=spectralRadius,
            inputScaling=inputScaling,
            reservoirScaling=reservoirScaling,
            leakingRate=leakingRate,
            initialTransient=self.initialTransient,
            inputData=self.trainingInputData,
            outputData=self.trainingOutputData,
            inputWeightRandom=self.inputWeightRandom,
            reservoirWeightRandom=self.reservoirWeightRandom)

        #Train the reservoir
        res.trainReservoir()

        #Predict for the validation data
        predictedOutputData = res.predict(self.validationInputData)

        #Calcuate the regression error
        errorFunction = rmse.MeanSquareError()
        regressionError = errorFunction.compute(self.validationOutputData,
                                                predictedOutputData)

        #Return the error
        return regressionError
    def __reservoirTrain__(self, x):

        #Extract the parameters
        meanDegree, beta = x
        meanDegree = int(meanDegree)

        # To get rid off the randomness in assigning weights, run it 10 times and  take the average error
        times = 100
        cumulativeError = 0

        for i in range(times):
            # Input and weight connectivity Matrix
            inputWeightMatrix = topology.ClassicInputTopology(
                self.inputD, self.size).generateWeightMatrix()
            reservoirWeightMatrix = topology.SmallWorldGraphs(
                size=self.size, meanDegree=meanDegree,
                beta=beta).generateWeightMatrix()

            #Create the reservoir
            res = classicESN.Reservoir(
                size=self.size,
                spectralRadius=self.spectralRadius,
                inputScaling=self.inputScaling,
                reservoirScaling=self.reservoirScaling,
                leakingRate=self.leakingRate,
                initialTransient=self.initialTransient,
                inputData=self.trainingInputData,
                outputData=self.trainingOutputData,
                inputWeightRandom=inputWeightMatrix,
                reservoirWeightRandom=reservoirWeightMatrix)

            #Train the reservoir
            res.trainReservoir()

            # Warm up
            predictedTrainingOutputData = res.predict(
                self.trainingInputData[-self.initialTransient:])

            #Predict for the validation data
            predictedOutputData = util.predictFuture(res, self.initialSeed,
                                                     self.horizon)

            gc.collect()

            #Calcuate the regression error
            errorFunction = metrics.MeanSquareError()
            error = errorFunction.compute(self.validationOutputData,
                                          predictedOutputData)
            cumulativeError += error

        regressionError = cumulativeError / times

        #Return the error
        print("\nThe Parameters: " + str(x) + " Regression error:" +
              str(regressionError))
        return regressionError
    def evaluate(self, x):

        # Extract the parameters
        attachment = int(x[0, 0])

        # To get rid off the randomness in assigning weights, run it 10 times and take the average error
        times = 1
        cumulativeError = 0

        for i in range(times):
            # Input and weight connectivity Matrix
            inputWeightMatrix = topology.ClassicInputTopology(
                self.inputD, self.size).generateWeightMatrix()
            network = topology.ScaleFreeNetworks(size=self.size,
                                                 attachmentCount=attachment)
            reservoirWeightMatrix = network.generateWeightMatrix()

            # Create the reservoir
            res = esn.Reservoir(size=self.size,
                                spectralRadius=self.spectralRadius,
                                inputScaling=self.inputScaling,
                                reservoirScaling=self.reservoirScaling,
                                leakingRate=self.leakingRate,
                                initialTransient=self.initialTransient,
                                inputData=self.trainingInputData,
                                outputData=self.trainingOutputData,
                                inputWeightRandom=inputWeightMatrix,
                                reservoirWeightRandom=reservoirWeightMatrix)

            # Train the reservoir
            res.trainReservoir()

            # Warm up
            predictedTrainingOutputData = res.predict(
                self.trainingInputData[-self.initialTransient:])

            # Predict for the validation data
            predictedOutputData = util.predictFuture(res, self.initialSeed,
                                                     self.horizon)

            gc.collect()

            # Calculate the regression error
            errorFunction = metrics.MeanSquareError()
            error = errorFunction.compute(self.validationOutputData,
                                          predictedOutputData)
            cumulativeError += error

        regressionError = cumulativeError / times

        # Return the error
        #print("Attachment: "+str(attachment) + "Error: "+str(regressionError))
        return regressionError
    def __collectOutputs__(self, featureIndices):

        # Form the feature and target vectors
        featureVectors = self.__formFeaturevectors__(self.inputData,
                                                     featureIndices)
        targetVectors = self.outputData

        # Append bias
        featureVectors = np.hstack((np.ones(
            (featureVectors.shape[0], 1)), featureVectors))

        # Input weight matrix
        inputSize = featureVectors.shape[1]
        reservoirSize = self.lowerLayerParameters['size']
        inputWeightRandom = topology.RandomInputTopology(
            inputSize, reservoirSize, self.
            lowerLayerParameters['inputConnectivity']).generateWeightMatrix()
        reservoirWeightRandom = topology.RandomReservoirTopology(
            reservoirSize, self.lowerLayerParameters['reservoirConnectivity']
        ).generateWeightMatrix()

        # Generate the reservoir
        res = esn.Reservoir(
            size=self.lowerLayerParameters['size'],
            spectralRadius=self.lowerLayerParameters['spectralRadius'],
            inputScaling=self.lowerLayerParameters['inputScaling'],
            reservoirScaling=self.lowerLayerParameters['reservoirScaling'],
            leakingRate=self.lowerLayerParameters['leakingRate'],
            initialTransient=self.lowerLayerParameters['initialTransient'],
            inputData=featureVectors,
            outputData=targetVectors,
            inputWeightRandom=inputWeightRandom,
            reservoirWeightRandom=reservoirWeightRandom,
            reservoirActivationFunction=self.
            lowerLayerParameters['reservoirActivation'],
            outputActivationFunction=self.
            lowerLayerParameters['outputActivation'])

        # Train the reservoir
        res.trainReservoir()

        # Just assign the weights randomly

        # Store the reservoir
        self.lowerLayerNetworks.append(res)

        # Collect the outputs
        outputs = res.predict(featureVectors)

        return outputs
예제 #6
0
def tuneTrainPredictGA(trainingInputData, trainingOutputData, validationOutputData,
                 initialInputSeedForValidation, testingData, size = 256,initialTransient=50,
                 spectralRadiusBound=(0.0,1.0),
                 inputScalingBound=(0.0,1.0),
                 reservoirScalingBound=(0.0,1.0),
                 leakingRateBound=(0.0,1.0),
                 reservoirTopology=None):

    # Generate the input and reservoir weight matrices based on the reservoir topology
    inputWeightMatrix = topology.ClassicInputTopology(inputSize=trainingInputData.shape[1], reservoirSize=size).generateWeightMatrix()
    if reservoirTopology is None:
        reservoirWeightMatrix = topology.ClassicReservoirTopology(size=size).generateWeightMatrix()
    else: #TODO - think about matrix multiplication
        reservoirWeightMatrix = reservoirTopology.generateWeightMatrix()

    resTuner = tuner.ReservoirParameterTuner(size=size,
                                             initialTransient=initialTransient,
                                             trainingInputData=trainingInputData,
                                             trainingOutputData=trainingOutputData,
                                             initialSeed=initialInputSeedForValidation,
                                             validationOutputData=validationOutputData,
                                             spectralRadiusBound=spectralRadiusBound,
                                             inputScalingBound=inputScalingBound,
                                             reservoirScalingBound=reservoirScalingBound,
                                             leakingRateBound=leakingRateBound,
                                             inputWeightMatrix=inputWeightMatrix,
                                             reservoirWeightMatrix=reservoirWeightMatrix)
    spectralRadiusOptimum, inputScalingOptimum, reservoirScalingOptimum, leakingRateOptimum = resTuner.getOptimalParameters()

    #Train
    network = esn.Reservoir(size=size,
                              spectralRadius=spectralRadiusOptimum,
                              inputScaling=inputScalingOptimum,
                              reservoirScaling=reservoirScalingOptimum,
                              leakingRate=leakingRateOptimum,
                              initialTransient=initialTransient,
                              inputData=trainingInputData,
                              outputData=trainingOutputData,
                              inputWeightRandom=inputWeightMatrix,
                              reservoirWeightRandom=reservoirWeightMatrix)
    network.trainReservoir()

    warmupFeatureVectors, warmTargetVectors = formFeatureVectors(validationOutputData)
    predictedWarmup = network.predict(warmupFeatureVectors[-initialTransient:])

    initialInputSeedForTesing = validationOutputData[-1]

    predictedOutputData = predictFuture(network, initialInputSeedForTesing, testingData.shape[0])[:,0]
    return predictedOutputData
    def trainReservoir(self):

        # Features for the network in the higher layer
        features = None

        # Collect outputs from the lower layer
        for i in range(self.lowerLayerCount):
            if (features is None):  # First time
                features = self.__collectOutputs__(self.featureIndicesList[i])
            else:
                features = np.hstack(
                    (features,
                     self.__collectOutputs__(self.featureIndicesList[i])))

        # Append bias
        features = np.hstack((np.ones((features.shape[0], 1)), features))

        # Generate the higher layer reservoir
        # where features are the outputs of the lower layer networks
        inputSize = features.shape[1]
        reservoirSize = self.higherLayerParameters['size']

        inputWeightRandom = topology.RandomInputTopology(
            inputSize, reservoirSize, self.
            higherLayerParameters['inputConnectivity']).generateWeightMatrix()
        reservoirWeightRandom = topology.RandomReservoirTopology(
            self.higherLayerParameters['size'],
            self.higherLayerParameters['reservoirConnectivity']
        ).generateWeightMatrix()

        self.higherLayerReservoir = esn.Reservoir(
            size=self.higherLayerParameters['size'],
            spectralRadius=self.higherLayerParameters['spectralRadius'],
            inputScaling=self.higherLayerParameters['inputScaling'],
            reservoirScaling=self.higherLayerParameters['reservoirScaling'],
            leakingRate=self.higherLayerParameters['leakingRate'],
            initialTransient=self.higherLayerParameters['initialTransient'],
            inputData=features,
            outputData=self.outputData,
            inputWeightRandom=inputWeightRandom,
            reservoirWeightRandom=reservoirWeightRandom,
            reservoirActivationFunction=self.
            higherLayerParameters['reservoirActivation'],
            outputActivationFunction=self.
            higherLayerParameters['outputActivation'])
        # Train the composite network
        self.higherLayerReservoir.trainReservoir()
    def __reservoirTrain__(self, x):

        #Extract the parameters
        spectralRadius = x[0]
        inputScaling = x[1]
        reservoirScaling = x[2]
        leakingRate = x[3]

        #Create the reservoir
        res = classicESN.Reservoir(
            size=self.size,
            spectralRadius=spectralRadius,
            inputScaling=inputScaling,
            reservoirScaling=reservoirScaling,
            leakingRate=leakingRate,
            initialTransient=self.initialTransient,
            inputData=self.trainingInputData,
            outputData=self.trainingOutputData,
            inputWeightRandom=self.inputWeightRandom,
            reservoirWeightRandom=self.reservoirWeightRandom)

        #Train the reservoir
        res.trainReservoir()

        # Warm up
        predictedTrainingOutputData = res.predict(
            self.trainingInputData[-self.initialTransient:])

        #Predict for the validation data
        predictedOutputData = util.predictFuture(res, self.initialSeed,
                                                 self.horizon)

        gc.collect()

        #Calcuate the regression error
        errorFunction = metrics.MeanSquareError()
        regressionError = errorFunction.compute(self.validationOutputData,
                                                predictedOutputData)

        #Return the error
        print("\nThe Parameters: " + str(x) + " Regression error:" +
              str(regressionError))
        return regressionError
    def __createTransformer__(self, featureVectors):

        # Append the bias
        #featureVectors = np.hstack((np.ones((featureVectors.shape[0],1)),featureVectors))
        featureVectors = featureVectors
        targetVectors = self.outputData

        # Input weight matrix
        inputSize = featureVectors.shape[1]
        reservoirSize = self.featureTransformerParameters['size']
        inputWeightRandom = topology.RandomInputTopology(
            inputSize, reservoirSize,
            self.featureTransformerParameters['inputConnectivity']
        ).generateWeightMatrix()
        reservoirWeightRandom = topology.RandomReservoirTopology(
            reservoirSize,
            self.featureTransformerParameters['reservoirConnectivity']
        ).generateWeightMatrix()

        # Generate the reservoir
        self.transformer = esn.Reservoir(
            size=self.featureTransformerParameters['size'],
            spectralRadius=self.featureTransformerParameters['spectralRadius'],
            inputScaling=self.featureTransformerParameters['inputScaling'],
            reservoirScaling=self.
            featureTransformerParameters['reservoirScaling'],
            leakingRate=self.featureTransformerParameters['leakingRate'],
            initialTransient=self.
            featureTransformerParameters['initialTransient'],
            inputData=featureVectors,
            outputData=targetVectors,
            inputWeightRandom=inputWeightRandom,
            reservoirWeightRandom=reservoirWeightRandom,
            reservoirActivationFunction=self.
            featureTransformerParameters['reservoirActivation'],
            outputActivationFunction=self.
            featureTransformerParameters['outputActivation'])

        # Collect and return the internal state
        internalStates = self.transformer.collectInternalStates(featureVectors)

        return internalStates
    def trainReservoir(self):

        # Feature transformation
        features = self.__createTransformer__(self.inputData)

        # Append bias
        features = np.hstack((np.ones((features.shape[0], 1)), features))

        # Generate the predictor
        # where features are transformed using transformer(esn)
        inputSize = features.shape[1]
        reservoirSize = self.predictorParameters['size']
        inputWeightRandom = topology.RandomInputTopology(
            inputSize, reservoirSize, self.
            predictorParameters['inputConnectivity']).generateWeightMatrix()
        reservoirWeightRandom = topology.RandomReservoirTopology(
            self.predictorParameters['size'],
            self.predictorParameters['reservoirConnectivity']
        ).generateWeightMatrix()

        self.predictor = esn.Reservoir(
            size=self.predictorParameters['size'],
            spectralRadius=self.predictorParameters['spectralRadius'],
            inputScaling=self.predictorParameters['inputScaling'],
            reservoirScaling=self.predictorParameters['reservoirScaling'],
            leakingRate=self.predictorParameters['leakingRate'],
            initialTransient=self.predictorParameters['initialTransient'],
            inputData=features,
            outputData=self.outputData,
            inputWeightRandom=inputWeightRandom,
            reservoirWeightRandom=reservoirWeightRandom,
            reservoirActivationFunction=self.
            predictorParameters['reservoirActivation'],
            outputActivationFunction=self.
            predictorParameters['outputActivation'])
        # Train the predictor network
        self.predictor.trainReservoir()
                                      arbitraryDepth=depth,
                                      spectralRadiusBound=(0.0,1.25),
                                      inputScalingBound=(0.0,1.0),
                                      reservoirScalingBound=(0.0,1.0),
                                      leakingRateBound=(0.0,1.0),
                                      inputWeightMatrix=inputWeight,
                                      reservoirWeightMatrix=reservoirWeight)

spectralRadiusOptimum, inputScalingOptimium, reservoirScalingOptimum, leakingRateOptimum = tuner.getOptimalParameters()


res = ESN.Reservoir(size=size,
                    inputData=featureVectors,
                    outputData=targetVectors,
                    spectralRadius=spectralRadiusOptimum,
                    inputScaling=inputScalingOptimium,
                    reservoirScaling=reservoirScalingOptimum,
                    leakingRate=leakingRateOptimum,
                    initialTransient=0,
                    inputWeightRandom=inputWeight,
                    reservoirWeightRandom=reservoirWeight)
res.trainReservoir()

# Warm up
predictedTrainingOutputData = res.predict(featureVectors[:initialTransient])

# Predict the future
predictedTestingOutputData = util.predictFutureDays(res, trainingSeries, depth, horizon)

error = metrics.RootMeanSquareError().compute(testingSeries.values.flatten().reshape(horizon,1), predictedTestingOutputData.values.flatten().reshape(horizon,1))
print("Regression error:"+str(error))
예제 #12
0
def tuneTrainPredictConnectivityGA(trainingInputData, trainingOutputData, validationOutputData,
                                  initialInputSeedForValidation, horizon, noOfBest, size=256,initialTransient=50,
                                  resTopology = Topology.Random,
                                  popSize=100, maxGeneration=100):

    # Other reservoir parameters
    spectralRadius = 0.79
    inputScaling = 0.5
    reservoirScaling = 0.5
    leakingRate = 0.3

    if(resTopology == Topology.Random):
        resTuner = rgTuner.RandomGraphTuner(size=size,
                                            initialTransient=initialTransient,
                                            trainingInputData=trainingInputData,
                                            trainingOutputData=trainingOutputData,
                                            initialSeed=initialInputSeedForValidation,
                                            validationOutputData=validationOutputData,
                                            noOfBest=noOfBest,
                                            spectralRadius=spectralRadius, inputScaling=inputScaling,
                                            reservoirScaling=reservoirScaling, leakingRate=leakingRate,
                                            populationSize=popSize, maxGeneration=maxGeneration)
        resTuner.__tune__()
        reservoirConnectivityOptimum = resTuner.getOptimalParameters()
        bestPopulation = resTuner.getBestPopulation()

        inputWeightMatrix = topology.ClassicInputTopology(inputSize=trainingInputData.shape[1], reservoirSize=size).generateWeightMatrix()
        reservoirWeightMatrix = topology.RandomReservoirTopology(size=size, connectivity=reservoirConnectivityOptimum).generateWeightMatrix()

    elif(resTopology == Topology.ErdosRenyi):
        resTuner = rgTuner.ErdosRenyiTuner(size=size,
                                           initialTransient=initialTransient,
                                           trainingInputData=trainingInputData,
                                           trainingOutputData=trainingOutputData,
                                           initialSeed=initialInputSeedForValidation,
                                           validationOutputData=validationOutputData,
                                           noOfBest=noOfBest,
                                           spectralRadius=spectralRadius, inputScaling=inputScaling,
                                           reservoirScaling=reservoirScaling, leakingRate=leakingRate,
                                           populationSize=popSize, maxGeneration=maxGeneration)
        resTuner.__tune__()
        probabilityOptimum = resTuner.getOptimalParameters()
        bestPopulation = resTuner.getBestPopulation()

        inputWeightMatrix = topology.ClassicInputTopology(inputSize=trainingInputData.shape[1], reservoirSize=size).generateWeightMatrix()
        reservoirWeightMatrix = topology.ErdosRenyiTopology(size=size, probability=probabilityOptimum).generateWeightMatrix()

    elif(resTopology == Topology.ScaleFreeNetworks):
        resTuner = rgTuner.ScaleFreeNetworksTuner(size=size,
                                                 initialTransient=initialTransient,
                                                 trainingInputData=trainingInputData,
                                                 trainingOutputData=trainingOutputData,
                                                 initialSeed=initialInputSeedForValidation,
                                                 validationOutputData=validationOutputData,
                                                 noOfBest=noOfBest,
                                                 spectralRadius=spectralRadius, inputScaling=inputScaling,
                                                 reservoirScaling=reservoirScaling, leakingRate=leakingRate,
                                                 populationSize=popSize, maxGeneration=maxGeneration)
        resTuner.__tune__()
        attachmentOptimum = resTuner.getOptimalParameters()
        bestPopulation = resTuner.getBestPopulation()

        inputWeightMatrix = topology.ClassicInputTopology(inputSize=trainingInputData.shape[1], reservoirSize=size).generateWeightMatrix()
        reservoirWeightMatrix = topology.ScaleFreeNetworks(size=size, attachmentCount=attachmentOptimum).generateWeightMatrix()
    elif(resTopology == Topology.SmallWorldGraphs):
        resTuner = rgTuner.SmallWorldNetworksTuner(size=size,
                                                  initialTransient=initialTransient,
                                                  trainingInputData=trainingInputData,
                                                  trainingOutputData=trainingOutputData,
                                                  initialSeed=initialInputSeedForValidation,
                                                  validationOutputData=validationOutputData,
                                                  noOfBest=noOfBest,
                                                  spectralRadius=spectralRadius, inputScaling=inputScaling,
                                                  reservoirScaling=reservoirScaling, leakingRate=leakingRate,
                                                  populationSize=popSize, maxGeneration=maxGeneration)
        resTuner.__tune__()
        meanDegreeOptimum, betaOptimum  = resTuner.getOptimalParameters()
        bestPopulation = resTuner.getBestPopulation()

        inputWeightMatrix = topology.ClassicInputTopology(inputSize=trainingInputData.shape[1], reservoirSize=size).generateWeightMatrix()
        reservoirWeightMatrix = topology.SmallWorldGraphs(size=size, meanDegree=int(meanDegreeOptimum), beta=betaOptimum).generateWeightMatrix()

    #Train
    network = esn.Reservoir(size=size,
                            spectralRadius=spectralRadius,
                            inputScaling=inputScaling,
                            reservoirScaling=reservoirScaling,
                            leakingRate=leakingRate,
                            initialTransient=initialTransient,
                            inputData=trainingInputData,
                            outputData=trainingOutputData,
                            inputWeightRandom=inputWeightMatrix,
                            reservoirWeightRandom=reservoirWeightMatrix)
    network.trainReservoir()

    warmupFeatureVectors, warmTargetVectors = formFeatureVectors(validationOutputData)
    predictedWarmup = network.predict(warmupFeatureVectors[-initialTransient:])

    initialInputSeedForTesting = validationOutputData[-1]

    predictedOutputData = predictFuture(network, initialInputSeedForTesting, horizon)[:,0]
    return predictedOutputData, bestPopulation
예제 #13
0
def tuneTrainPredictConnectivityNonBrute(trainingInputData,
                                         trainingOutputData,
                                         validationOutputData,
                                         initialInputSeedForValidation,
                                         horizon,
                                         size=256,
                                         initialTransient=50,
                                         resTopology=Topology.Random):

    # Other reservoir parameters
    spectralRadius = 0.79
    inputScaling = 0.5
    reservoirScaling = 0.5
    leakingRate = 0.3

    if (resTopology == Topology.Random):
        resTuner = tuner.RandomConnectivityTuner(
            size=size,
            initialTransient=initialTransient,
            trainingInputData=trainingInputData,
            trainingOutputData=trainingOutputData,
            initialSeed=initialInputSeedForValidation,
            validationOutputData=validationOutputData,
            spectralRadius=spectralRadius,
            inputScaling=inputScaling,
            reservoirScaling=reservoirScaling,
            leakingRate=leakingRate)
        reservoirConnectivityOptimum = resTuner.getOptimalParameters()
        inputWeightMatrix = topology.ClassicInputTopology(
            inputSize=trainingInputData.shape[1],
            reservoirSize=size).generateWeightMatrix()
        reservoirWeightMatrix = topology.RandomReservoirTopology(
            size=size,
            connectivity=reservoirConnectivityOptimum).generateWeightMatrix()

    elif (resTopology == Topology.SmallWorldGraphs):
        resTuner = tuner.SmallWorldGraphsConnectivityNonBruteTuner(
            size=size,
            initialTransient=initialTransient,
            trainingInputData=trainingInputData,
            trainingOutputData=trainingOutputData,
            initialSeed=initialInputSeedForValidation,
            validationOutputData=validationOutputData,
            spectralRadius=spectralRadius,
            inputScaling=inputScaling,
            reservoirScaling=reservoirScaling,
            leakingRate=leakingRate)
        meanDegreeOptimum, betaOptimum = resTuner.getOptimalParameters()
        inputWeightMatrix = topology.ClassicInputTopology(
            inputSize=trainingInputData.shape[1],
            reservoirSize=size).generateWeightMatrix()
        reservoirWeightMatrix = topology.SmallWorldGraphs(
            size=size, meanDegree=int(meanDegreeOptimum),
            beta=betaOptimum).generateWeightMatrix()

    #Train
    network = ESN.Reservoir(size=size,
                            spectralRadius=spectralRadius,
                            inputScaling=inputScaling,
                            reservoirScaling=reservoirScaling,
                            leakingRate=leakingRate,
                            initialTransient=initialTransient,
                            inputData=trainingInputData,
                            outputData=trainingOutputData,
                            inputWeightRandom=inputWeightMatrix,
                            reservoirWeightRandom=reservoirWeightMatrix)
    network.trainReservoir()

    warmupFeatureVectors, warmTargetVectors = formFeatureVectors(
        validationOutputData)
    predictedWarmup = network.predict(warmupFeatureVectors[-initialTransient:])

    initialInputSeedForTesing = validationOutputData[-1]

    predictedOutputData = predictFuture(network, initialInputSeedForTesing,
                                        horizon)[:, 0]
    return predictedOutputData
예제 #14
0
def tuneTrainPredict(trainingInputData,
                     trainingOutputData,
                     validationOutputData,
                     initialInputSeedForValidation,
                     testingData,
                     size=256,
                     initialTransient=50,
                     spectralRadiusBound=(0.0, 1.0),
                     inputScalingBound=(0.0, 1.0),
                     reservoirScalingBound=(0.0, 1.0),
                     leakingRateBound=(0.0, 1.0),
                     reservoirTopology=None):

    # Generate the input and reservoir weight matrices based on the reservoir topology
    inputWeightMatrix = topology.ClassicInputTopology(
        inputSize=trainingInputData.shape[1],
        reservoirSize=size).generateWeightMatrix()
    if reservoirTopology is None:
        reservoirWeightMatrix = topology.ClassicReservoirTopology(
            size=size).generateWeightMatrix()
    else:  #TODO - think about matrix multiplication
        reservoirWeightMatrix = reservoirTopology.generateWeightMatrix()

    resTuner = tuner.ReservoirParameterTuner(
        size=size,
        initialTransient=initialTransient,
        trainingInputData=trainingInputData,
        trainingOutputData=trainingOutputData,
        initialSeed=initialInputSeedForValidation,
        validationOutputData=validationOutputData,
        spectralRadiusBound=spectralRadiusBound,
        inputScalingBound=inputScalingBound,
        reservoirScalingBound=reservoirScalingBound,
        leakingRateBound=leakingRateBound,
        inputWeightMatrix=inputWeightMatrix,
        reservoirWeightMatrix=reservoirWeightMatrix,
        minimizer=tuner.Minimizer.DifferentialEvolution)
    spectralRadiusOptimum, inputScalingOptimum, reservoirScalingOptimum, leakingRateOptimum = resTuner.getOptimalParameters(
    )

    #Train
    network = ESN.Reservoir(size=size,
                            spectralRadius=spectralRadiusOptimum,
                            inputScaling=inputScalingOptimum,
                            reservoirScaling=reservoirScalingOptimum,
                            leakingRate=leakingRateOptimum,
                            initialTransient=initialTransient,
                            inputData=trainingInputData,
                            outputData=trainingOutputData,
                            inputWeightRandom=inputWeightMatrix,
                            reservoirWeightRandom=reservoirWeightMatrix)
    network.trainReservoir()

    warmupFeatureVectors, warmTargetVectors = formFeatureVectors(
        validationOutputData)
    predictedWarmup = network.predict(warmupFeatureVectors[-initialTransient:])

    initialInputSeedForTesing = validationOutputData[-1]

    predictedOutputData = predictFuture(network, initialInputSeedForTesing,
                                        testingData.shape[0])[:, 0]

    cumError = 0
    times = 100
    for i in range(times):
        # Run for many time and get the average regression error
        regressionError = util.trainAndGetError(
            size=size,
            spectralRadius=spectralRadiusOptimum,
            inputScaling=inputScalingOptimum,
            reservoirScaling=reservoirScalingOptimum,
            leakingRate=leakingRateOptimum,
            initialTransient=initialTransient,
            trainingInputData=trainingInputData,
            trainingOutputData=trainingOutputData,
            inputWeightMatrix=inputWeightMatrix,
            reservoirWeightMatrix=reservoirWeightMatrix,
            validationOutputData=validationOutputData,
            horizon=testingData.shape[0],
            testingActualOutputData=testingData)
        cumError += regressionError

    error = cumError / times
    return predictedOutputData, error
예제 #15
0
initialTransient = 50

# Input-to-reservoir fully connected
inputWeight = topology.ClassicInputTopology(
    inputSize=inputTrainingData.shape[1],
    reservoirSize=size).generateWeightMatrix()

# Reservoir-to-reservoir fully connected
reservoirWeight = topology.ClassicReservoirTopology(
    size=size).generateWeightMatrix()

res = ESN.Reservoir(size=size,
                    inputData=inputTrainingData,
                    outputData=outputTrainingData,
                    spectralRadius=0.79,
                    inputScaling=0.5,
                    reservoirScaling=0.5,
                    leakingRate=0.3,
                    initialTransient=initialTransient,
                    inputWeightRandom=inputWeight,
                    reservoirWeightRandom=reservoirWeight)
res.trainReservoir()

#Warm up
predictedTrainingOutputData = res.predict(inputTrainingData)

#Predict future values
predictedTestOutputData = util.predictFuture(res, trainingData[-1], nTesting)

#Calculate the error
errorFunction = rmse.MeanSquareError()
error = errorFunction.compute(testingData, predictedTestOutputData)
예제 #16
0
size = 100
inputWeight = topology.ClassicInputTopology(
    inputSize=featureVectors.shape[1],
    reservoirSize=size).generateWeightMatrix()

# Reservoir-to-reservoir fully connected
#reservoirWeight = topology.ClassicReservoirTopology(size=size).generateWeightMatrix()
reservoirWeight = topology.SmallWorldGraphs(size=size,
                                            meanDegree=int(size / 2),
                                            beta=0.8).generateWeightMatrix()

res = ESN.Reservoir(size=size,
                    inputData=featureVectors,
                    outputData=targetVectors,
                    spectralRadius=1.5,
                    inputScaling=0.1,
                    reservoirScaling=0.5,
                    leakingRate=0.7,
                    initialTransient=0,
                    inputWeightRandom=inputWeight,
                    reservoirWeightRandom=reservoirWeight)
res.trainReservoir()

#Warm up
predictedTrainingOutputData = res.predict(featureVectors)

predictedSeries = pd.Series(
    data=predictedTrainingOutputData.flatten(),
    index=normalizedSeries.index[-predictedTrainingOutputData.shape[0]:])

predictedSeries = util.descaleSeries(predictedSeries)
actualSeries = util.descaleSeries(normalizedSeries)
                                trainingOutputData=trainingOutputData,
                                validationInputData=validationInputData,
                                validationOutputData=validationOutputData,
                                spectralRadiusBound=spectralRadiusBound,
                                inputScalingBound=inputScalingBound,
                                reservoirScalingBound=reservoirScalingBound,
                                leakingRateBound=leakingRateBound)
spectralRadiusOptimum, inputScalingOptimum, reservoirScalingOptimum, leakingRateOptimum, inputWeightOptimum, reservoirWeightOptimum = resTuner.getOptimalParameters(
)

#Train
res = reservoir.Reservoir(size=size,
                          spectralRadius=spectralRadiusOptimum,
                          inputScaling=inputScalingOptimum,
                          reservoirScaling=reservoirScalingOptimum,
                          leakingRate=leakingRateOptimum,
                          initialTransient=initialTransient,
                          inputData=trainingInputData,
                          outputData=trainingOutputData,
                          inputWeightRandom=inputWeightOptimum,
                          reservoirWeightRandom=reservoirWeightOptimum)
res.trainReservoir()

#Warm up
predictedTrainingOutputData = res.predict(validationInputData)

# Predict
predictedTestOutputData = util.predictFuture(res, validationData[-1], nTesting)

#Plotting of the prediction output and error
outplot = outputPlot.OutputPlot("Outputs/Prediction.html",
                                "Mackey-Glass Time Series",