Package org.neuroph.nnet

Source Code of org.neuroph.nnet.NeuroFuzzyPerceptron

/**
* Copyright 2010 Neuroph Project http://neuroph.sourceforge.net
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.neuroph.nnet;

import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
import org.neuroph.core.Layer;
import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.Neuron;
import org.neuroph.core.transfer.Trapezoid;
import org.neuroph.nnet.learning.LMS;
import org.neuroph.util.ConnectionFactory;
import org.neuroph.util.LayerFactory;
import org.neuroph.util.NeuralNetworkFactory;
import org.neuroph.util.NeuralNetworkType;
import org.neuroph.util.NeuronProperties;
import org.neuroph.util.SummingFunctionType;
import org.neuroph.util.TransferFunctionType;
import org.neuroph.util.WeightsFunctionType;

/**
* The NeuroFuzzyReasoner class represents Neuro Fuzzy Reasoner architecture.
*
* @author Zoran Sevarac <sevarac@gmail.com>
*/
public class NeuroFuzzyPerceptron extends NeuralNetwork {
 
  /**
   * The class fingerprint that is set to indicate serialization
   * compatibility with a previous version of the class.
   */ 
  private static final long serialVersionUID = 1L;

  public NeuroFuzzyPerceptron(double[][] pointsSets, double[][] timeSets) {
    Vector<Integer> inputSets = new Vector<Integer>();
    inputSets.addElement(new Integer(4));
    inputSets.addElement(new Integer(3));

    this.createStudentNFR(2, inputSets, 4, pointsSets, timeSets);
  }

  public NeuroFuzzyPerceptron(int inputNum, Vector<Integer> inputSets, int outNum) {
    this.createNetwork(inputNum, inputSets, outNum);
  }

  // build example network for student classification
  private void createStudentNFR(int inputNum, Vector<Integer> inputSets, int outNum,
      double[][] pointsSets, double[][] timeSets) {

    // set network type
    this.setNetworkType(NeuralNetworkType.NEURO_FUZZY_REASONER);

    // createLayer input layer
    NeuronProperties neuronProperties = new NeuronProperties();
    Layer inLayer = LayerFactory.createLayer(new Integer(inputNum),
        neuronProperties);
    this.addLayer(inLayer);

    // createLayer fuzzy set layer
    neuronProperties.setProperty("transferFunction",
        TransferFunctionType.TRAPEZOID);
    Enumeration<Integer> e = inputSets.elements();
    int fuzzySetsNum = 0;
    while (e.hasMoreElements()) {
      Integer i = e.nextElement();
      fuzzySetsNum = fuzzySetsNum + i.intValue();
    }
    Layer setLayer = LayerFactory.createLayer(fuzzySetsNum,
        neuronProperties);
    this.addLayer(setLayer);

    // TODO: postavi parametre funkcija pripadnosti
    // nizove sa trning elementima iznesi van klase i prosledjuj ih kao
    // parametre
    Iterator<Neuron> ii = setLayer.getNeuronsIterator();
    Enumeration<Integer> en;// =setLayer.neurons();
    int c = 0;
    while (ii.hasNext()) {
      Neuron cell = ii.next();
      Trapezoid tf = (Trapezoid) cell.getTransferFunction();

      if (c <= 3) {
        tf.setLeftLow(pointsSets[c][0]);
        tf.setLeftHigh(pointsSets[c][1]);
        tf.setRightLow(pointsSets[c][3]);
        tf.setRightHigh(pointsSets[c][2]);
      } else {
        tf.setLeftLow(timeSets[c - 4][0]);
        tf.setLeftHigh(timeSets[c - 4][1]);
        tf.setRightLow(timeSets[c - 4][3]);
        tf.setRightHigh(timeSets[c - 4][2]);
      }
      c++;
    }

    // povezi prvi i drugi sloj
    int s = 0; // brojac celija sloja skupova (fazifikacije)
    for (int i = 0; i < inputNum; i++) { // brojac ulaznih celija
      Neuron from = inLayer.getNeuronAt(i);
      int jmax = inputSets.elementAt(i).intValue();
      for (int j = 0; j < jmax; j++) {
        Neuron to = setLayer.getNeuronAt(s);
        ConnectionFactory.createConnection(from, to, 1);
        s++;
      }
    }

    // ----------------------------------------------------------

    // createLayer rules layer
    NeuronProperties ruleNeuronProperties = new NeuronProperties(
                        WeightsFunctionType.WEIGHTED_INPUT,
                        SummingFunctionType.MIN,
                        TransferFunctionType.LINEAR);
    en = inputSets.elements();
    int fuzzyAntNum = 1;
    while (en.hasMoreElements()) {
      Integer i = en.nextElement();
      fuzzyAntNum = fuzzyAntNum * i.intValue();
    }
    Layer ruleLayer = LayerFactory.createLayer(fuzzyAntNum,
        ruleNeuronProperties);
    this.addLayer(ruleLayer);

    int scIdx = 0; // set cell index

    for (int i = 0; i < inputNum; i++) { // brojac ulaza (grupa fuzzy
                        // skupova)
      int setsNum = inputSets.elementAt(i).intValue();

      for (int si = 0; si < setsNum; si++) { // brojac celija fuzzy
                          // skupova
        if (i == 0) {
          Neuron from = setLayer.getNeuronAt(si);
          int connPerCell = fuzzyAntNum / setsNum;
          scIdx = si;

          for (int k = 0; k < connPerCell; k++) { // brojac celija
                              // hipoteza
            Neuron to = ruleLayer.getNeuronAt(si * connPerCell + k);
            ConnectionFactory.createConnection(from, to,
                new Double(1));
          } // for
        } // if
        else {
          scIdx++;
          Neuron from = setLayer.getNeuronAt(scIdx);
          int connPerCell = fuzzyAntNum / setsNum;

          for (int k = 0; k < connPerCell; k++) { // brojac celija
                              // hipoteza
            int toIdx = si + k * setsNum;
            Neuron to = ruleLayer.getNeuronAt(toIdx);
            ConnectionFactory.createConnection(from, to,
                new Double(1));
          } // for k
        } // else
      } // for si
    } // for i

    // kreiraj izlazni sloj
    neuronProperties = new NeuronProperties();
    neuronProperties.setProperty("transferFunction",
        TransferFunctionType.STEP);
    Layer outLayer = LayerFactory.createLayer(new Integer(outNum),
        neuronProperties);
    this.addLayer(outLayer);

    ConnectionFactory.fullConnect(ruleLayer, outLayer);

    // inicijalizuj ulazne i izlazne celije
    NeuralNetworkFactory.setDefaultIO(this);

    this.setLearningRule(new LMS());
  }

  /**
   * Creates custom NFR architecture
   *
   * @param inputNum
   *            number of getInputsIterator
   * @param inputSets
   *            input fuzzy sets
   * @param outNum
   *            number of outputs
   */
  private void createNetwork(int inputNum, Vector<Integer> inputSets, int outNum) {

    // set network type
    this.setNetworkType(NeuralNetworkType.NEURO_FUZZY_REASONER);

    // CREATE INPUT LAYER
    NeuronProperties neuronProperties = new NeuronProperties();
    Layer inLayer = LayerFactory.createLayer(new Integer(inputNum),
        neuronProperties);
    this.addLayer(inLayer);

    // CREATE FUZZY SET LAYER
    neuronProperties.setProperty("transferFunction",
        TransferFunctionType.TRAPEZOID);
    Enumeration<Integer> e = inputSets.elements();
    int fuzzySetsNum = 0;
    while (e.hasMoreElements()) {
      Integer i = e.nextElement();
      fuzzySetsNum = fuzzySetsNum + i.intValue();
    }
    Layer setLayer = LayerFactory.createLayer(new Integer(fuzzySetsNum),
        neuronProperties);
    this.addLayer(setLayer);

    // TODO: postavi parametre funkcija pripadnosti
    // nizove sa trning elementima iznesi van klase i prosledjuj ih kao
    // parametre
    Iterator<Neuron> ii = setLayer.getNeuronsIterator();
    Enumeration<Integer> en;// =setLayer.neurons();
    int c = 0;
    while (ii.hasNext()) {
      Neuron cell = ii.next();
      Trapezoid tf = (Trapezoid) cell.getTransferFunction();
      /*
       * if (c<=3) { tf.setLeftLow(pointsSets[c][0]);
       * tf.setLeftHigh(pointsSets[c][1]); tf.setRightLow(pointsSets[c][3]);
       * tf.setRightHigh(pointsSets[c][2]); } else { tf.setLeftLow(timeSets[c-4][0]);
       * tf.setLeftHigh(timeSets[c-4][1]); tf.setRightLow(timeSets[c-4][3]);
       * tf.setRightHigh(timeSets[c-4][2]); } c++;
       */
    }

    // createLayer connections between input and fuzzy set getLayersIterator
    int s = 0; // brojac celija sloja skupova (fazifikacije)
    for (int i = 0; i < inputNum; i++) { // brojac ulaznih celija
      Neuron from = inLayer.getNeuronAt(i);
      int jmax = inputSets.elementAt(i).intValue();
      for (int j = 0; j < jmax; j++) {
        Neuron to = setLayer.getNeuronAt(s);
        ConnectionFactory.createConnection(from, to, new Double(1));
        s++;
      }
    }

    // ----------------------------------------------------------

    // kreiraj sloj pravila
    neuronProperties
        .setProperty("summingFunction", SummingFunctionType.MIN);
    neuronProperties.setProperty("transferFunction",
        TransferFunctionType.LINEAR);
    en = inputSets.elements();
    int fuzzyAntNum = 1;
    while (en.hasMoreElements()) {
      Integer i = en.nextElement();
      fuzzyAntNum = fuzzyAntNum * i.intValue();
    }
    Layer ruleLayer = LayerFactory.createLayer(new Integer(fuzzyAntNum),
        neuronProperties);
    this.addLayer(ruleLayer);

    // povezi set i rule layer

    int scIdx = 0; // set cell index

    for (int i = 0; i < inputNum; i++) { // brojac ulaza (grupa fuzzy
                        // skupova)
      int setsNum = inputSets.elementAt(i).intValue();

      for (int si = 0; si < setsNum; si++) { // brojac celija fuzzy
                          // skupova
        if (i == 0) {
          Neuron from = setLayer.getNeuronAt(si);
          int connPerCell = fuzzyAntNum / setsNum;
          scIdx = si;

          for (int k = 0; k < connPerCell; k++) { // brojac celija
                              // hipoteza
            Neuron to = ruleLayer.getNeuronAt(si * connPerCell + k);
            ConnectionFactory.createConnection(from, to,
                new Double(1));
          } // for
        } // if
        else {
          scIdx++;
          Neuron from = setLayer.getNeuronAt(scIdx);
          int connPerCell = fuzzyAntNum / setsNum;

          for (int k = 0; k < connPerCell; k++) { // brojac celija
                              // hipoteza
            int toIdx = si + k * setsNum;
            Neuron to = ruleLayer.getNeuronAt(toIdx);
            ConnectionFactory.createConnection(from, to,
                new Double(1));
          } // for k
        } // else
      } // for si
    } // for i

    // set input and output cells for this network
    neuronProperties = new NeuronProperties();
    neuronProperties.setProperty("transferFunction",
        TransferFunctionType.STEP);
    Layer outLayer = LayerFactory.createLayer(new Integer(outNum),
        neuronProperties);
    this.addLayer(outLayer);

    ConnectionFactory.fullConnect(ruleLayer, outLayer);

    // set input and output cells for this network
    NeuralNetworkFactory.setDefaultIO(this);

    this.setLearningRule(new LMS());
  }

}
TOP

Related Classes of org.neuroph.nnet.NeuroFuzzyPerceptron

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.