package test1;
//import java.io.BufferedReader;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.InputStreamReader;
//import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;
public class ID3
extends JFrame {
private static ID3 instance = null;
private static final long serialVersionUID = 1L; //eclipse me met un warning si je le met pas
private String nomAttributs
[] =
null;
// contient les noms des attributs private int nbExemples = 0; // nombre d'exemples
private int nbAttributs = 0; // nombre d'attributs
private Vector valeurAttributs
[];
// tableau contenant les valeurs des attributs (string) private Vector Exemples =
null;
// contient les exemples sous forme de chiffres private Noeud root = null; // noeud racine
private JTree arbre =
null;
/**
* utilisation du pattern singleton
*
*/
super();
win=w;
initialize();
}
public static ID3 getInstance() {
if (instance == null) {
//instance = new ID3();
}
return instance;
}
private void initialize() {
try {
readData();
createArbre();
afficherArbre();
e1.printStackTrace();
}
}
/**
* met la machine en route, cette methode est appelée à chaque changement de selection de fichier d'entrée
* @param fichier
* @throws Exception
*/
/**
* Cette fonction renvoie la valeur numérique correspondant
* à la valeur de l'attribut (string)
* @param attribut
* @param value
* @return
*/
public int valeurAttribut
(int attribut,
String value
) { int valeur = valeurAttributs[attribut].indexOf(value); //renvoie l'index de l'objet dans le vecteur (-1 si inexistant)
if (valeur < 0) //Value est inexistante dans le vecteur
{
valeurAttributs[attribut].addElement(value);
valeur = valeurAttributs[attribut].size() - 1;
}
return valeur;
}
/**
* Cette fonction ouvre le fichier contenant les exemples et les intègre au programme
* @param nomFichier
* @throws Exception
*/
nbExemples = 0;
nbAttributs = 0;
nbAttributs = win.get_nb_att();
nbExemples = win.get_nb_exp();
nomAttributs =
new String[nbAttributs
];
for (int i = 0; i < nbAttributs; i++) {
nomAttributs
[i
] =
(String) win.
tab_appr.
getValueAt(0, i
+1);
//nomAttributs contient le nom de tous les attributs + le comcept cible}
for (int i = 0; i < nbAttributs; i++)
System.
out.
println("nom d'attribut"+i+
"est"+nomAttributs
[i
]);
valeurAttributs =
new Vector[nbAttributs
];
for (int i = 0; i < nbAttributs; i++) {
valeurAttributs
[i
] =
new Vector();
}
/*
* recupération des données
*/
int[] exemple;
//while(true)
//{
exemple = new int[nbAttributs];
for (int i = 1; i < nbExemples; i++) {
for (int j = 0; j < nbAttributs; j++) {
value =
(String) win.
tab_appr.
getValueAt(i, j
+1);
exemple[j] = valeurAttribut(j, value);
System.
out.
println("exemple"+j+
"est"+exemple
[j
]);
}
Exemples.add(exemple);
}
for (int i = 0; i < nbAttributs; i++)
System.
out.
println("valeur attribut"+i+
"est+"+valeurAttributs
[i
]);
//}
}
/**
* c'est comme le Port-Salut
*
*/
public void createArbre() {
root = new Noeud(valeurAttributs, Exemples, nbAttributs, nomAttributs);
root.generationArbre();
}
/**
* c'est comme le Port-Salut
*
*/
public void afficherArbre() {
if (arbre != null) {
jPanel.remove(arbre);
}
arbre =
new JTree(racine
);
this.setVisible(true);
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
if (jPanel == null) {
}
return jPanel;
}
}
[b]Noeud.java[/b]
package test1;
import java.util.Vector;
import javax.swing.tree.DefaultMutableTreeNode;
public class Noeud {
private int attribut = -1; // -1 si les fils ont des valeurs differentes
private int valeur = -1; // valeur numérique de l'attribut père, qui enendre ce noeud
private Noeud pere = null; // c'est comme le Port-Salut
private Noeud[] fils = null; // c'est comme le Port-Salut
private String nomAttributs
[];
private int nbAttributs = 0;
private Vector valeurAttributs
[];
private Vector Exemples =
new Vector();
// contient les sous-exemples des exemples du noeud père // correspondant à la valeur qui engendra ce noeud
private int etiquette = -1; // -1 il ne s'agit pas d'une feuille
// sinon c'est une feuille et etiquette représente la valeur du concept cible
/**
*
* @param attributs2
* @param exemples
* @param attributs
* @param exemples2
*/
public Noeud
(Vector[] attributs2,
Vector exemples,
int attributs,
String[] nomAttributs
) { super();
Exemples = exemples;
nbAttributs = attributs;
valeurAttributs = attributs2;
this.nomAttributs = nomAttributs;
}
if (pere != null && etiquette != -1) // feuille
{
nomAttributs[nbAttributs - 1] + " = " +
valeurAttributs[attribut].elementAt(etiquette));
return noeud;
}
if (pere != null && etiquette == -1) // noeud central
{
nomAttributs[attribut]);
for (int i = 0; i < fils.length; i++) {
if (fils[i] != null) {
noeud.add(fils[i].generationAffichage());
}
}
return noeud;
}
if (pere == null && etiquette == -1) //racine
{
for (int i = 0; i < fils.length; i++) {
if (fils[i] != null) {
noeud.add(fils[i].generationAffichage());
}
}
return noeud;
}
return noeud;
}
public void complementNoeud(int valeur, Noeud pere) {
this.valeur = valeur;
this.pere = pere;
}
public void generationArbre() {
attribut = attributGanant();
if (attribut != -1) {
fils = new Noeud[valeurAttributs[attribut].size()];
for (int i = 0; i < valeurAttributs[attribut].size(); i++) {
sousExemle = sousExemple(attribut, i);
if (sousExemle.size() > 0) {
fils[i] = new Noeud(valeurAttributs, sousExemle, nbAttributs, nomAttributs);
fils[i].complementNoeud(i, this);
fils[i].generationArbre();
}
}
/*
* à partir d'ici les fils sont formés, on regarde s'ils ont la même étique
* si oui alors ce noeud peux devenir une feuille
*/
int previous = -1;
for (int i = 0; i < fils.length; i++) {
if (fils[i] != null && previous == -1) // on recherche la premiere etiquette valide
{
previous = fils[i].etiquette;
}
if (previous != -1 && fils[i] != null && fils[i].etiquette != previous) // on verifie si les noeuds inferieurs ont la même etiquette
{
return;
}
}
if (previous == -1) {
return;
}
//si on arrive jusqu'ici c'est que les noeuds inferieur ne servent à rien, donc on les virre
attribut = nbAttributs - 1;
etiquette = previous;
fils = null;
} else // feuille
{
attribut = nbAttributs - 1;
etiquette = ((int[]) Exemples.elementAt(0))[attribut];
}
}
/**
* Donne un sous ensemble d'exemple pour un attribut et une valeur de cette attribut
* @param pattribut
* @param pvaleur
* @return
*/
public Vector sousExemple
(int pattribut,
int pvaleur
) { int num = Exemples.size();
for (int i = 0; i < num; i++) {
int[] exemple = (int[]) Exemples.elementAt(i);
if (exemple[pattribut] == pvaleur) {
sousExemples.addElement(exemple);
}
}
return sousExemples;
}
/**
* Determine quel attribut doit figurer dans ce noeud
* @return
*/
public int attributGanant() {
double gain[] = new double[nbAttributs - 1]; //[nbAttributs-1];
int attribut = -1;
double max = -1;
for (int i = 0; i < nbAttributs - 1; i++) {
attributeValues.removeAllElements();
for (int j = 0; j < Exemples.size(); j++) {
attributeValues.
addElement(new Integer(((int[]) Exemples.
elementAt(j
))[i
]));
}
gain[i] = gainAttribut(attributeValues);
}
for (int i = 0; i < gain.length; i++) {
if (gain[i] > max) {
max = gain[i];
attribut = i;
}
}
if (max == 0) {
return -1;
}
return attribut;
}
/**
* donne le gain d'un vecteur
* @param data
* @return
*/
public double gainAttribut
(Vector data
) { double gain = 0;
double max = data.size();
int nbApparitionTotal = 0;
int i = 0;
double nbApparition = 0;
double proba = 0;
while (nbApparitionTotal < max) {
nbApparition = 0;
for (int j = 0; j < data.size(); j++) {
if (((Integer) data.
elementAt(j
)).
intValue() == i
) { nbApparition++;
nbApparitionTotal++;
}
}
proba = nbApparition / max;
gain += -
(proba
) *
Math.
log(proba
);
i++;
}
return gain;
}
public int getAttribut() {
return attribut;
}
public Noeud[] getFils() {
return fils;
}
public Noeud getPere() {
return pere;
}
public int getValeur() {
return valeur;
}
}