JINGPaC



Java Interface for
Neural and Genetic Pattern Classification

Getting Started - JINGPaC 2.0

JINGPaC 2.0 viene distribuito con un'applicazione di test. Fare riferimento a questa pagina per ulteriori informazioni.


Getting Started - JINGPaC 1.0

Attenzione: le informazioni in questa sezione riguardano JINGPaC 1.0
.

Classi che devono essere implementate dall'utente (tutte le classi possono essere rinominate a preferenza) :

DataReaderConcrete

questa classe deve implementare l'interfaccia DataReader del package classifier.
Il compito di questa classe è quello di caricare i dati (per l'addestramento del sistema) nel TrainingSet da una sorgente esterna... se il sistema da addestrare è SuperVisionato i dati di ingresso dovranno essere memorizzati come coppie "input-output atteso" in un data-pool (p.e. un oggetto HashMap); i valori di input per ogni coppia saranno quindi utilizzati come keys memorizzate in una struttura dati separata (p.e. un oggetto ArrayList).
Il metodo getMap() dovrà quindi ritornare l'intero data_pool mentre il metodo getInputObjects() ritornerà la struttura contenente le keys per l'accesso al data_pool stesso.
Se il sistema è non SuperVisionato basterà implementare il metodo getInputObjects().

Nella realizzazione di un Classificatore di Pattern per targhe automobilistiche il nostro approccio è stato quello di estendere l'interfaccia DataReader con DataReaderTarghe.

import classifier.*;
import classifier.gp.*;

public interface DataReaderTarghe extends DataReader {	
	public long getOccurencies(Long key);
	public boolean isExt();
}				

Questa interfaccia è stata quindi implementata da TargheReaderRed (data reader per input a 28 bit) e da TargheReaderExt (per input 128 bit).

Esempio di una entry del trainingSet a 28 bit

0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0 5

Esempio di una entry del trainingSet a 128 bit

8289280 7896702 7368824 1886417008 1
FitnessFunctionConcrete

questa classe deve implementare l'interfaccia FitnessFunction del package classifier.gp.
La funzione di fitness rappresenta uno dei nodi cruciali dell' approccio basato su Genetic Programming: essa infatti deve valutare ciascun individuo (programma genetico) coinvolto nell'evoluzione mediante l'assegnazione di un opportuno punteggio di merito (fitness); tanto maggiore è il punteggio ottenuto tanto migliori sono le probabilità per un individuo di "propagare" il proprio patrimonio genetico tra le generazioni.
Il metodo evaluate(Population pop) dovrà pertanto processare ciascun programma genetico per ciascuna entry del TrainingSet andando a comparare il valore restituito con quello atteso ed assegnare ad ogni individuo l' opportuno punteggio.

Un esempio di FitnessFunctionConcrete è rappresentato da BinaryClassifierFitness.

fitnessConditionConcrete

questa classe deve implementare l'interfaccia fitnessCondition del package classfier.gp.
L'implementazione di questa classe deve esprime una condizione di arresto sul ciclo evolutivo; in particolare tale condizione dovrà essere espressa in funzione del punteggio di fitness del migliore individuo di ciascuna generazione.
L'evoluzione delle popolazioni coinvolte terminerà pertanto, o al raggiungimento del numero massimo di generazioni (parametro di setup) o al soddisfacimento della condizione espressa da un'istanza di fitnessConditionConcrete.

La nostra implementazione sviluppata nell'ambito del progetto del Classificatore di Pattern per targhe automobilistiche è GPatternFitnessTest.

FunctionConcrete

questa classe deve estendere la classe astratta Function del package classifier.gp; I mattoni di ogni singolo programma genetico sono oggetti FunctionConcrete e Variable; i primi estendono la classe astratta Function mentre i secondi la classe astratta Terminal ed entrambi la classe astratta GProgram; è chiaro quindi che tutte le funzioni che vanno a determinare il function set di un determinato processo evolutivo devono essere di tipo FunctionConcrete.

Nel costruttore della classe deve essere specificato il numero di operandi su cui la funzione lavora.

public FunctionConcrete() {
	arg = new GProgram[/*numero di operandi */];
}			

Il metodo eval() viene invocato durante l'esecuzione di un programma genetico; tramite override esso è stato ridefinito secondo le seguenti signature:

  • long eval(long l)
  • double eval(double i)
  • char[] eval(char[] string)
  • Object eval(Object input)

Per un corretto funzionamento è necessario che tutte le funzioni appartenenti al function set (e tutte le variabili del terminal set) siano coerenti con un unico tipo di dato.
Allo stadio attule di sviluppo abbiamo riscontrato buone prestazioni nei tempi di evoluzione tra una generazione e l'altra lavorando con i tipi primitivi mentre un significativo calo si manifesta lavorando con gli oggetti; è ragionevole supporre che tale riduzione nelle prestazioni sia dovuta al sistema di gestione della memoria del Garbage Collector. Attualmente stiamo cercando soluzioni per ridurre questo divario.

Implementazioni di FunctionConcrete create nell'ambito del Classificatore di Pattern per targhe automobilistiche:

FunctionAND
Operatore AND binario bitwise.
FunctionOR
Operatore OR binario bitwise.
FunctionXOR
Operatore XOR binario bitwise.
FunctionNOT
Operatore NOT unario bitwise.
Variable

questa classe deve estendere la classe astratta Terminal del package classifier.gp.
Insieme agli oggetti FunctionConcrete, i Variable costituiscono i "mattoni" di ciascun programma genetico; nella fattispecie essi rappresentano le foglie della struttura ad albero di un genetic program. Quando un dato di input viene passato ad un programma gli oggetti funzione (...i nodi dell'albero) chiamano ricorsivamente il metodo eval() dei nodi sottostanti, quando viene invocato il metodo eval() di una Variable esso deve ritornare il dato concreto che verrà processato dalla function al nodo parent...

Poichè il nostro approccio nell'implementazione del Classificatore di Pattern per targhe automobilistiche è stato quello di utilizzare sono operatori bitwise, abbiamo istanziato oggetti Varible passondo loro un valore long di mascheramento; in questo modo l'invocazione di eval() restituiva al nodo parent l'i-esimo bit del valore di input (AND logico tra l'input e la maschera...).

public Variable(long value) {
	this.mask = value;
}

public long eval(long x) {
	return (x & mask)/mask;
}				
errorConditionConcrete

questa classe deve implementare l'interfaccia errorCondition del package classifier.nn.
Similmente a fitnessConditionConcrete l'implementazione di questa classe deve esprimere una condizione di arresto sull'algoritmo di addestramento di una rete neurale.
La terminazione di una sessione di training infatti può avvenire qualora venga raggiunto il numero massimo di cicli (parametro di setup) o qualora la condizione espressa da errorConditionConcrete venga soddisfatta; tale condizione in particolar modo dovrà essere espressa in funzione dell'errore percentuale di classificazione rispetto al TrainingSet.

La nostra implementazione di errorConditionConcrete è NNPatternErrorTest.

Download

JINGPaC 2.0
JINGPaC 2.0 beta
Questo pacchetto contiene i sorgenti, il jar, la JavaDoc e l'implementazione di esempio
JINGPaC 2.0 KeyNote Presentation
Presenatione di JINGPaC in formato KeyNote
JINGPaC 1.0
JINGPaC 1.0 source + example
Sorgente JINGPaC + codice sorgente di due applicazioni tester. vedi README interno all'archivio per istruzioni

Attenzione: a causa di un errore con alcune versioni di Java RMI l'esempio corredato non funziona. Commentate tutte le righe di codice relative ad RMI per eseguire JINGPaC in locale.

JINGPaC 1.0 - ParamGUI
ParamGUI
Interfaccia grafica in SWING per settare i parametri della parte di Programmazione Genetica

JavaDoc

JINGPaC 2.0 - JavaDoc
JavaDoc
Consulta online la JavaDoc di JINGPaC 2.0. L'archivio è contenuto nel file di installazione di JINGPaC
JINGPaC 1.0 - JavaDoc
JavaDoc
Consulta online la JavaDoc di JINGPaC 1.0

Link

SourceForge.net Logo