From 7d346c511b23764aaa367cfee39511a76889de16 Mon Sep 17 00:00:00 2001 From: Matisse DEKEISER <matisse.dekeiser.etu@univ-lille.fr> Date: Fri, 29 Nov 2024 20:56:06 +0100 Subject: [PATCH] =?UTF-8?q?Fin=20de=20la=20Javadoc=20(commentaires=20dans?= =?UTF-8?q?=20les=20fonctions=20partiellement=20corrig=C3=A9s),=20correcti?= =?UTF-8?q?on=20l=C3=A9g=C3=A8re=20du=20rendu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DevEfficace/rapport.md | 24 ++-- .../sae/classification/knn/MethodKNN.java | 113 ++++++++++-------- .../classification/knn/distance/Distance.java | 17 ++- .../knn/distance/DistanceEuclidienne.java | 7 +- .../DistanceEuclidienneNormalisee.java | 12 ++ .../knn/distance/DistanceManhattan.java | 8 +- .../distance/DistanceManhattanNormalisee.java | 6 + .../model/ClassificationModel.java | 12 +- .../sae/classification/model/DataType.java | 21 +++- .../sae/classification/model/Iris.java | 6 +- .../classification/model/LoadableData.java | 74 ++++++++---- .../classification/model/PointFactory.java | 6 +- .../sae/classification/model/Pokemon.java | 78 +++++++----- .../sae/classification/utils/ViewUtil.java | 2 +- .../classification/view/DataStageView.java | 14 +-- .../view/DataVisualizationView.java | 10 +- .../sae/classification/view/KNNView.java | 17 ++- .../sae/classification/view/LoadDataView.java | 14 ++- .../classification/view/MainStageView.java | 8 +- 19 files changed, 295 insertions(+), 154 deletions(-) diff --git a/DevEfficace/rapport.md b/DevEfficace/rapport.md index 0462ca2..6af361b 100644 --- a/DevEfficace/rapport.md +++ b/DevEfficace/rapport.md @@ -101,7 +101,7 @@ En appliquant cette méthode, voici les résultats que nous avons obtenus avec : On obtient donc un taux de réussite plutôt élevé. À chaque fois, l'algorithme choisit le K avec le plus haut taux de réussite. En cas d'égalité, il choisit le plus petit K parmi les égalités. -### Pokemon +### Pokémon **Classification selon le type** @@ -113,21 +113,19 @@ On obtient donc un taux de réussite plutôt élevé. À chaque fois, l'algorith | Distance Manhattan (normalisée) | 0.178 | 0.188 | 0.2 | 0.215 | 0.205 | 0.203 | 0.194 | 0.190 | 0.184 | 0.180 | 0.190 | 7 | --- -Le taux de reussiste est ici plus bas, cela s'explique notement par le nombre d'attribut different et la complexité a identifier le type d'un pokemon. -Cependant le taux de reussiste reste satisfaisant et stable. +Le taux de réussite est ici plus bas, cela s'explique notamment par le nombre d'attributs différents et la complexité à identifier le type d'un Pokémon. +Cependant, le taux de réussite reste satisfaisant et stable. -**Classification Legendaire ou Non Legendaire** +**Classification (légendaire ou non légendaire)** +| Distance \ K | 1 | 3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 | 21 | K choisit | +|-----------------------------------|-------|-------|-------|-------|-------|-------|----|----|----|----|----|----| +| Distance euclidienne | 0.986 | 0.978 | 0.984 | 0.980 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 1 | +| Distance euclidienne (normalisée) | 1.0 | 0.998 | 0.998 | 0.996 | 0.996 | 0.998 | 0.998 | 0.998 | 0.998 | 0.998 | 0.998 | 1 | +| Distance Manhattan | 0.978 | 0.972 | 0.984 | 0.980 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 5 | +| Distance Manhattan (normalisée) | 0.980 | 0.984 | 0.988 | 0.984 | 0.984 | 0.986 | 0.986 | 0.986 | 0.986 | 0.986 | 0.984 | 5 | - -| Distance \ K | 1 | 3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 | 21 | K choisit | -|---------------------------------|-------|-------|-------|-------|-------|-------|----|----|----|----|----|----| -| Distance Euclidienne | 0.986 | 0.978 | 0.984 | 0.980 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 1 | -| Distance Euclidienne Normalisée | 1.0 | 0.998 | 0.998 | 0.996 | 0.996 | 0.998 | 0.998 | 0.998 | 0.998 | 0.998 | 0.998 | 1 | -| Distance Manhattan | 0.978 | 0.972 | 0.984 | 0.980 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 0.984 | 5 | -| Distance Manhattan Normalisée | 0.980 | 0.984 | 0.988 | 0.984 | 0.984 | 0.986 | 0.986 | 0.986 | 0.986 | 0.986 | 0.984 | 5 | - -On a ici des résultats bien meilleurs. En effet, estimer si un Pokemon est legendaire ou non est bien plus simple qu'estimer son type, les attributs des pokemons legendaires sont bien différent des pokemons non-legendaire contrairement aux types, ou selon les types, les valeurs ne fluctuent pas autant +On a ici des résultats bien meilleurs. En effet, estimer si un Pokémon est légendaire ou non est bien plus simple qu'estimer son type, les attributs des Pokémons légendaires sont bien différents de ceux non-légendaires, contrairement aux types, où, selon les types, les valeurs ne fluctuent pas autant. --- diff --git a/src/main/java/fr/univlille/sae/classification/knn/MethodKNN.java b/src/main/java/fr/univlille/sae/classification/knn/MethodKNN.java index 0feaffe..19c4a13 100644 --- a/src/main/java/fr/univlille/sae/classification/knn/MethodKNN.java +++ b/src/main/java/fr/univlille/sae/classification/knn/MethodKNN.java @@ -12,9 +12,9 @@ import java.util.*; public class MethodKNN { - - - + /** + * Chemin du fichier de données. + */ public static String path = System.getProperty("user.dir") + File.separator + "res" + File.separator; public static double[] amplitude; public static double[] minData; @@ -24,10 +24,9 @@ public class MethodKNN { } - /** - * Permet de mettre a jour les données de l'algorithme. Recalcul les amplitudes et les min/max des données - * @param datas Les données sur lequel l'algorithme doit travailler + * Permet de mettre à jour les données de l'algorithme. Recalcule les amplitudes et les min/max des données. + * @param datas Les données sur lesquelles l'algorithme doit travailler */ public static void updateModel(List<LoadableData> datas) { if(datas.isEmpty()) return; @@ -37,7 +36,6 @@ public class MethodKNN { maxData = new double[numAttributes]; amplitude = new double[numAttributes]; - for(LoadableData l :datas) { double[] attributes = l.getAttributes(); for(int i = 0; i<numAttributes; i++) { @@ -51,78 +49,97 @@ public class MethodKNN { } } + /** + * Renvoie une liste des voisins. + * @param datas Liste des données + * @param data Donnée cible + * @param k Nombre de voisins + * @param distance Algorithme de distance utilisée pour calculer la proximité entre les points + * @return Liste des voisins + */ public static List<LoadableData> kVoisins(List<LoadableData> datas, LoadableData data, int k, Distance distance) { - // On recupere toutes les données + // On récupère toutes les données. List<LoadableData> voisins = new ArrayList<>(datas); - // on retire la valeur dont on cherche les voisins + // On retire la valeur dont on cherche les voisins. voisins.remove(data); - // On tri la liste en fonction de la distance entre chaque point et data + // On trie la liste en fonction de la distance entre chaque point et data. voisins.sort(new DataComparator(distance, data)); - - // On renvoie les k premier qui sont les k avec la plus petite distance a data + // On renvoie les k premiers qui sont les k avec la plus petite distance à data. return voisins.subList(0, k); - } - - + /** + * Estime la classe d'une donnée cible en se basant sur ses k plus proches voisins. + * @param datas Liste de données + * @param data Donnée cible + * @param k Nombre de voisins + * @param distance Algorithme de distance utilisée pour calculer la proximité entre les points + * @return Classe estimée pour la donnée cible + * @throws IllegalAccessException + */ public static String estimateClass(List<LoadableData> datas, LoadableData data, int k, Distance distance) throws IllegalAccessException { - // On recupere les K voisions de data. + // On récupère les K voisins de data. List<LoadableData> kVoisins = MethodKNN.kVoisins(datas, data, k, distance); - // On compte le nombre de représentation de chaque class parmis les voisins - // Et on récupere la plus présente + // On compte le nombre de représentations de chaque classe parmi les voisins + // Et on récupère la plus présente. Map<String, Integer> classOfNeighbours = new HashMap<>(); String currentClass = kVoisins.get(0).getClassification(); - - for(LoadableData voisin : kVoisins) { int newValue = ((classOfNeighbours.get(voisin.getClassification()) == null) ? 0 : classOfNeighbours.get(voisin.getClassification()) )+ 1; classOfNeighbours.put(voisin.getClassification(), newValue); - // si la classe est plus presente que la classe acutelemnt majoritaire, on change la classe majoritaire. - // Si il y'a egalité alors on garde la premiere trouvé + // Si la classe est plus présente que la classe actuellement majoritaire, on change la classe majoritaire. + // S'il y a égalité, alors on garde la première trouvée. if(classOfNeighbours.get(voisin.getClassification()) > classOfNeighbours.get(currentClass)) { currentClass = voisin.getClassification(); } - } - return currentClass; } - + /** + * Estimation du meilleur K. + * @param datas Liste des données + * @param distance Algorithme de distance utilisée pour calculer la proximité entre les points + * @return Meilleur k déterminé + * @throws IllegalAccessException + */ public static int bestK(List<LoadableData> datas, Distance distance) throws IllegalAccessException { - // On borne le K pour eviter de trouver un K trop grand + // On borne le K pour éviter de trouver un K trop grand int maxK = (int) (Math.sqrt(datas.size())); System.out.println("Max k: " + maxK); int betK = 1; Map<Integer, Double> results = new LinkedHashMap<>(); - // Pour chaque valeur impaire possible de K, on calcul la robustesse (le taux de reussite) de l'algorithme. + // Pour chaque valeur impaire possible de K, on calcule la robustesse (le taux de réussite) de l'algorithme. for(int i =1; i<maxK; i = i +2) { results.put(i, robustesse(datas, i, distance, 0.2)); - // On modifie le meilleur k si le taux est superieur au K precedent - // Si egalité, on garde le premier trouvé + // On modifie le meilleur k si le taux est supérieur au K precedent + // Si égalité, on garde le premier trouvé if(results.get(i) > results.get(betK)) betK = i; } System.out.println("Results: " + results); return betK; - } - + /** + * Évaluation de la robustesse de l'algorithme KNN. + * @param datas Liste des données + * @param k Nombre de voisins + * @param distance Algorithme de distance utilisée pour calculer la proximité entre les points + * @param testPart Fraction des données utilisée pour le test + * @return Taux de réussite de l'algorithme pour un k spécifié + * @throws IllegalAccessException + */ public static double robustesse(List<LoadableData> datas, int k, Distance distance, double testPart) throws IllegalAccessException { - - - double taux = 0; for(int i = 0; i<1/testPart; i++) { @@ -145,19 +162,20 @@ public class MethodKNN { String baseClass = l.getClassification(); if(baseClass.equals(MethodKNN.estimateClass(trainingData,l, k, distance))) totalFind++; } - - // On affiche le taux de reussite a chaque tour System.out.println("total find: " +totalFind + " total try: " + totalTry); taux += (totalFind/(double) totalTry); } - - - return taux/(1/testPart); } + /** + * Fonction principale. + * @param args Arguments donnés + * @throws CsvRequiredFieldEmptyException + * @throws IllegalAccessException + */ public static void main(String[] args) throws CsvRequiredFieldEmptyException, IllegalAccessException { //Test de la robustesse et du meillleur K @@ -169,32 +187,23 @@ public class MethodKNN { MethodKNN.updateModel(model.getDatas()); System.out.println(); - // Permet de definir l'attribut sur lequel ont souhaite classifier: + // Permet de définir l'attribut sur lequel l'on souhaite classifier : LoadableData.setClassificationTypeGlobal(12); List<LoadableData> datas = ClassificationModel.getClassificationModel().getDatas(); - // On mélange les données pour tester sur differentes variétes car le fichier de base est trié. + // On mélange les données pour tester sur différentes variétés car le fichier de base est trié. Collections.shuffle(datas); for(int i = 0; i<1; i++) { System.out.println("Search best k"); - // On cherche le meilleure K + // On cherche le meilleur K int bestK = MethodKNN.bestK(datas, new DistanceManhattanNormalisee()); System.out.println(bestK); - // Puis on clacul la robustesse avec le K trouvé + // Puis on calcule la robustesse avec le K trouvé System.out.println(MethodKNN.robustesse( datas, bestK, new DistanceManhattanNormalisee(), 0.2)); } - - - } - - - - - - } diff --git a/src/main/java/fr/univlille/sae/classification/knn/distance/Distance.java b/src/main/java/fr/univlille/sae/classification/knn/distance/Distance.java index 24fd379..fce56cd 100644 --- a/src/main/java/fr/univlille/sae/classification/knn/distance/Distance.java +++ b/src/main/java/fr/univlille/sae/classification/knn/distance/Distance.java @@ -4,9 +4,19 @@ import fr.univlille.sae.classification.model.LoadableData; public interface Distance { - + /** + * Calcul de la distance. + * @param l1 Point 1 + * @param l2 Point 2 + * @return Distance calculée entre les 2 points + */ double distance(LoadableData l1, LoadableData l2); + /** + * Renvoie l'algorithme de distance selon le nom. + * @param name Nom de l'algorithme + * @return Classe liée à l'algorithme de distance + */ static Distance getByName(String name){ switch (name) { case "Euclidienne Normalisée": @@ -21,6 +31,11 @@ public interface Distance { } + /** + * Renvoie le nom de l'algorithme utilisé. + * @param distance Algorithme de distance + * @return Chaîne de caractères correspondante + */ static String getDistanceName(Distance distance){ if (distance instanceof DistanceEuclidienneNormalisee) { return "Euclidienne Normalisee"; diff --git a/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienne.java b/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienne.java index 954bd42..56611ff 100644 --- a/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienne.java +++ b/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienne.java @@ -4,7 +4,12 @@ import fr.univlille.sae.classification.model.LoadableData; public class DistanceEuclidienne implements Distance { - + /** + * Calcul de la distance. + * @param l1 Point 1 + * @param l2 Point 2 + * @return Distance calculée entre les 2 points + */ @Override public double distance(LoadableData l1, LoadableData l2) { if(l1.getAttributes().length != l2.getAttributes().length) throw new IllegalArgumentException("Error while trying to get Distance : Attributes do not match"); diff --git a/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneNormalisee.java b/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneNormalisee.java index 9be1180..812a9af 100644 --- a/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneNormalisee.java +++ b/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneNormalisee.java @@ -4,6 +4,13 @@ import fr.univlille.sae.classification.knn.MethodKNN; import fr.univlille.sae.classification.model.LoadableData; public class DistanceEuclidienneNormalisee implements Distance{ + + /** + * Calcul de la distance. + * @param l1 Point 1 + * @param l2 Point 2 + * @return Distance calculée entre les 2 points + */ @Override public double distance(LoadableData l1, LoadableData l2) { if(l1.getAttributes().length != l2.getAttributes().length) throw new IllegalArgumentException("Error while trying to get Distance : Attributes do not match"); @@ -25,6 +32,11 @@ public class DistanceEuclidienneNormalisee implements Distance{ return Math.sqrt(total); } + /** + * Renvoie les valeurs normalisées. + * @param l Liste des valeurs + * @return Tableau des valeurs normalisées + */ private double[] normalise(LoadableData l) { double[] dataNormalise = new double[l.getAttributes().length]; for(int i = 0;i<dataNormalise.length;i++) { diff --git a/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceManhattan.java b/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceManhattan.java index c5ea628..799e281 100644 --- a/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceManhattan.java +++ b/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceManhattan.java @@ -4,10 +4,14 @@ import fr.univlille.sae.classification.model.LoadableData; public class DistanceManhattan implements Distance{ + /** + * Calcul de la distance. + * @param l1 Point 1 + * @param l2 Point 2 + * @return Distance calculée entre les 2 points + */ public double distance(LoadableData l1, LoadableData l2){ double distance = 0; - - for(int i = 0 ;i<l1.getAttributes().length; i++){ distance = distance + Math.abs(l1.getAttributes()[i]- l2.getAttributes()[i]); } diff --git a/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanNormalisee.java b/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanNormalisee.java index 50a678b..1e30ace 100644 --- a/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanNormalisee.java +++ b/src/main/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanNormalisee.java @@ -6,6 +6,12 @@ import fr.univlille.sae.classification.model.LoadableData; public class DistanceManhattanNormalisee implements Distance{ + /** + * Calcul de la distance. + * @param l1 Point 1 + * @param l2 Point 2 + * @return Distance calculée entre les 2 points + */ @Override public double distance(LoadableData l1, LoadableData l2) { double distance = 0; diff --git a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java index b2ecdbe..cfa396d 100644 --- a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java +++ b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java @@ -20,15 +20,21 @@ import java.util.concurrent.ConcurrentHashMap; * Gère le chargement, l'ajout et la classification des données. */ public class ClassificationModel extends Observable { - + /** + * Données du modèle. + */ private List<LoadableData> datas; private final Map<LoadableData, Boolean> dataToClass; + /** + * Type de données. + */ private DataType type; - private static ClassificationModel model; - private Distance distance; + /** + * Valeurs de k liées à l'algorithme KNN. + */ private int kOptimal; private int k; diff --git a/src/main/java/fr/univlille/sae/classification/model/DataType.java b/src/main/java/fr/univlille/sae/classification/model/DataType.java index 99e9113..a819898 100644 --- a/src/main/java/fr/univlille/sae/classification/model/DataType.java +++ b/src/main/java/fr/univlille/sae/classification/model/DataType.java @@ -1,22 +1,41 @@ package fr.univlille.sae.classification.model; public enum DataType { - IRIS(4, Iris.class), POKEMON(12, Pokemon.class); + /** + * Nombre d'arguments nécessaires. + */ private final int argumentSize; + + /** + * Classe liée à l'élément. + */ private final Class<? extends LoadableData> clazz; + /** + * Constructeur de l'enum. + * @param argumentSize Nombre d'arguments nécessaires + * @param clazz Classe liée + */ DataType(int argumentSize, Class<? extends LoadableData> clazz) { this.argumentSize = argumentSize; this.clazz = clazz; } + /** + * Renvoie le nombre d'arguments. + * @return Nombre d'arguments + */ public int getArgumentSize() { return argumentSize; } + /** + * Renvoie la classe liée à l'élément de l'enum. + * @return Classe liée + */ public Class<? extends LoadableData> getClazz() { return clazz; } diff --git a/src/main/java/fr/univlille/sae/classification/model/Iris.java b/src/main/java/fr/univlille/sae/classification/model/Iris.java index c11c919..68a6f66 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Iris.java +++ b/src/main/java/fr/univlille/sae/classification/model/Iris.java @@ -25,7 +25,7 @@ public class Iris extends LoadableData { private String variety; /** - * Constructeur pour créer une instance de Iris avec tous les attributs. + * Constructeur pour créer une instance d'Iris avec tous les attributs. * @param sepalLength longueur du sépale. * @param sepalWidth largeur du sépale. * @param petalLength longueur du pétale. @@ -158,10 +158,6 @@ public class Iris extends LoadableData { return new String[0]; } - - - - /** * Renvoie les noms des attributs de l'Iris. * @return tableau de chaînes contenant les noms des attributs. diff --git a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java index 6908868..28dc4bb 100644 --- a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java +++ b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java @@ -11,17 +11,18 @@ import java.util.Map; * Classe abstraite représentant des données pouvant être chargées. */ public abstract class LoadableData { - + /** + * Ensemble des types de classification actuellement définis. + */ private static Set<String> classificationTypes; + /** + * Map contenant les classifications associées à leur couleur représentative. + */ private static Map<String, Color> classification = new HashMap<>() ; protected static int classificationType = 1; - - - // Ho-Ho 130, 30720, 3, 90, 1250000, 106, 154, 90 fire, flying, 199s - /** * Constructeur par défaut. */ @@ -43,19 +44,37 @@ public abstract class LoadableData { return classificationTypes; } + /** + * Renvoie une Map des classifications avec leur couleur réprésentative. + * @return Map des classifications avec leur couleur + */ public static Map<String, Color> getClassifications() { return classification; } + /** + * Définit le type de classification global à utiliser. + * @param classificationType Index du type de classification + * @throws IllegalArgumentException + * @throws IllegalAccessException + */ public static void setClassificationTypeGlobal(int classificationType) throws IllegalArgumentException, IllegalAccessException { LoadableData.classificationType = classificationType; } + /** + * Définit le type de classification pour un objet spécifique. + * @param classificationType Index du type de classification + * @throws IllegalArgumentException + * @throws IllegalAccessException + */ public abstract void setClassificationType(int classificationType) throws IllegalArgumentException, IllegalAccessException; /** * Définit les types de classification disponibles. - */ + * @param datas Liste des objets + * @throws IllegalAccessException + */ public static void setClassificationTypes(List<LoadableData> datas) throws IllegalAccessException { Set<String> types = new HashSet<>(); @@ -78,7 +97,12 @@ public abstract class LoadableData { LoadableData.classification.put("undefined", getColor(nb,nbOfColors)); } - + /** + * Génère une couleur unique pour chaque type de classification. + * @param nb Numéro de la couleur + * @param totalColors Nombre total de couleurs nécessaires + * @return La couleur générée + */ private static Color getColor(int nb, int totalColors) { // Ratio pour répartir les couleurs uniformément double ratio = (double) nb / (double) totalColors; @@ -100,22 +124,16 @@ public abstract class LoadableData { return Color.color(red, green, blue); } - /* private static Color getColor(int i) { - double ratio = (double) i / classificationTypes.size(); - - // Réduire les composantes pour éviter les tons clairs - double red = 0.2 + 0.6 * ratio; // Entre 0.2 et 0.8 - double green = 0.8 - 0.6 * ratio; // Entre 0.8 et 0.2 - double blue = 0.5 + 0.3 * Math.sin(ratio * Math.PI); // Entre 0.5 et 0.8 - - return Color.color(red, green, blue); - } - - - */ - + /** + * Renvoie une Map des attributs valides pour la classification. + * @return Map des attributs avec leur nom et valeur + */ public abstract Map<String, Object> getClassifiedAttributes(); + /** + * + * @return Renvoie l'index du type de la classification. + */ public abstract int getClassificationType() ; /** @@ -124,12 +142,22 @@ public abstract class LoadableData { */ public abstract void setClassification(String classification) throws IllegalAccessException; + /** + * Renvoie les noms des attributs de l'objet. + * @return Tableau de chaînes contenant les noms des attributs ainsi que leur variable + */ public abstract Map<String, Object> getAttributesNames(); - - + /** + * Renvoie les attributs numériques. + * @return Tableau des attributs numériques + */ public abstract double[] getAttributes(); + /** + * Renvoie les attributs de type chaînes de caractères. + * @return Tableau des attributs String + */ public abstract String[] getStringAttributes(); } diff --git a/src/main/java/fr/univlille/sae/classification/model/PointFactory.java b/src/main/java/fr/univlille/sae/classification/model/PointFactory.java index 63a1bc9..2b21cc7 100644 --- a/src/main/java/fr/univlille/sae/classification/model/PointFactory.java +++ b/src/main/java/fr/univlille/sae/classification/model/PointFactory.java @@ -9,9 +9,9 @@ public class PointFactory { /** * Crée un point de données en fonction du type spécifié et des coordonnées fournies. - * @param type type de données - * @param coords coordonnées du point à créer. - * @return instance de LoadableData correspondant aux coordonnées, ou null en cas d'erreur. + * @param type Type de données + * @param coords Coordonnées du point à créer + * @return Instance de LoadableData correspondant aux coordonnées, ou null en cas d'erreur * @throws IllegalArgumentException si le nombre de coordonnées ne correspond pas au type spécifié. */ public static LoadableData createPoint(DataType type, Object[] coords) throws IllegalArgumentException { diff --git a/src/main/java/fr/univlille/sae/classification/model/Pokemon.java b/src/main/java/fr/univlille/sae/classification/model/Pokemon.java index a01479b..7f7e35e 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Pokemon.java +++ b/src/main/java/fr/univlille/sae/classification/model/Pokemon.java @@ -5,11 +5,12 @@ import com.opencsv.bean.CsvBindByName; import java.lang.reflect.Field; import java.util.*; +/** + * Représente un point Pokémon. + * Contient des informations sur les statistiques (attaque, défense, PV...) ainsi que les types du monstre. + */ public class Pokemon extends LoadableData{ - // name,attack,base_egg_steps,capture_rate,defense,experience_growth,hp,sp_attack,sp_defense,type1,type2,speed,is_legendary - // Swablu,40,5120,255.0,60,600000,45,75,50,normal,flying,1.2,False - @CsvBindByName(column = "name") private String name; @CsvBindByName(column = "attack") @@ -37,8 +38,22 @@ public class Pokemon extends LoadableData{ @CsvBindByName(column = "is_legendary") private Boolean isLegendary = null ; - - + /** + * Constructeur pour créer une instance de Pokémon avec tous les attributs. + * @param name Nom du monstre + * @param attack Statistique d'attaque + * @param baseEggSteps Pas nécessaires à l'éclosion de son œuf + * @param captureRate Taux de capture + * @param defense Statistique de défense + * @param experienceGrowth Taux de croissance de l'expérience + * @param hp Points de vie + * @param spAttack Statistique d'attaque spéciale + * @param spDefense Statistique de défense spéciale + * @param type1 Type principal + * @param type2 Type secondaire (non obligatoire) + * @param speed Statistique de vitesse + * @param isLegendary Est-il un Pokémon légendaire + */ public Pokemon(String name, int attack, int baseEggSteps, double captureRate, int defense, int experienceGrowth, int hp, int spAttack, int spDefense, String type1, String type2, double speed, boolean isLegendary) { super(); classificationType = 9; @@ -61,11 +76,11 @@ public class Pokemon extends LoadableData{ this.isLegendary = isLegendary; } - /** public Pokemon(Object[] list) { - this((String) list[0], (Integer) list[1], (Integer) list[2], (Double) list[3], (Integer) list[4], (Integer) list[5], (Integer) list[6], (Integer) list[7], (Integer) list[8], (String) list[9], (String) list[10], (Double) list[11], (Boolean) list[12]); - } - */ - + /** + * Constructeur avec un tableau. + * @param list Tableau d'élements + * @throws IllegalAccessException + */ public Pokemon(Object[] list) throws IllegalAccessException { Field[] fields = getClass().getDeclaredFields(); @@ -89,7 +104,7 @@ public class Pokemon extends LoadableData{ /** * Renvoie la classification de l'objet. * - * @return classification sous forme de chaîne. + * @return Classification sous forme de chaîne */ @Override public String getClassification() throws IllegalAccessException { @@ -99,7 +114,7 @@ public class Pokemon extends LoadableData{ /** * Définit la classification de l'objet. * - * @param classification classification à définir. + * @param classification Classification à définir */ @Override public void setClassification(String classification) throws IllegalAccessException { @@ -114,10 +129,9 @@ public class Pokemon extends LoadableData{ /** - * Permet de modifier l'attribut sur lequelle ont souhaite classifier - * Ne sont valable que les attributs present dans getClassificationAttributes() - * - * Le numéro de l'attribut correspond a sa place dans la liste de tous le attributs. + * Permet de modifier l'attribut sur laquelle l'on souhaite classifier + * Ne sont valables que les attributs présents dans getClassificationAttributes() + * Le numéro de l'attribut correspond à sa place dans la liste de tous les attributs. * @param classificationType */ public void setClassificationType(int classificationType) throws IllegalArgumentException, IllegalAccessException { @@ -130,9 +144,10 @@ public class Pokemon extends LoadableData{ LoadableData.setClassificationTypes(ClassificationModel.getClassificationModel().getDatas()); } - - - + /** + * Renvoie une Map des attributs valides pour la classification. + * @return Map des attributs avec leur nom et valeur + */ public Map<String, Object> getClassifiedAttributes() { Map<String, Object> attributes = new LinkedHashMap<>(); @@ -144,6 +159,10 @@ public class Pokemon extends LoadableData{ return attributes; } + /** + * + * @return + */ @Override public int getClassificationType() { return classificationType; @@ -151,10 +170,8 @@ public class Pokemon extends LoadableData{ /** * Renvoie les noms des attributs de l'objet. - * - * @return tableau de chaînes contenant les noms des attributs. + * @return Tableau de chaînes contenant les noms des attributs ainsi que leur variable */ - @Override public Map<String, Object> getAttributesNames() { Map<String, Object> attrNames = new LinkedHashMap<>(); @@ -174,22 +191,29 @@ public class Pokemon extends LoadableData{ return attrNames; } - - - - - + /** + * Renvoie les attributs numériques sous forme de tableau. + * @return Tableau des attributs numériques + */ @Override public double[] getAttributes() { return new double[]{attack, baseEggSteps, captureRate, defense, experienceGrowth, hp, spAttack, spDefense, speed}; } + /** + * Renvoie les attributs de type chaînes de caractères. + * @return Tableau des attributs String + */ @Override public String[] getStringAttributes() { return new String[]{type2, String.valueOf(isLegendary)}; } + /** + * Représentation sous forme de chaîne de l'objet Pokémon. + * @return Chaîne contenant les informations du Pokémon + */ @Override public String toString(){ return( diff --git a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java index 1cbe640..9b2ebb4 100644 --- a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java +++ b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java @@ -29,7 +29,7 @@ public class ViewUtil { /** * Définit la couleur de la forme. * @param form Forme à configurer - * @param controller Contrôleur principal pour le menu contextuel. + * @param controller Contrôleur principal pour le menu contextuel * @return Forme configurée */ public static Shape getForm(LoadableData dataLoaded, Shape form, Object controller) { diff --git a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java index 8692885..95a8fe8 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java @@ -30,17 +30,17 @@ import java.util.Map; * Implémente l'interface Observer pour recevoir des notifications de mise à jour. */ public class DataStageView extends DataVisualizationView implements Observer { - - - - - - + /** + * Regroupements de points. + */ private XYChart.Series series1; private XYChart.Series series2; private XYChart.Series series3; private XYChart.Series series4; + /** + * Fenêtre de la vue secondaire. + */ private Stage root; /** @@ -49,8 +49,6 @@ public class DataStageView extends DataVisualizationView implements Observer { */ public DataStageView(ClassificationModel model) { super(model); - - this.series1 = new XYChart.Series(); this.series2 = new XYChart.Series(); this.series3 = new XYChart.Series(); diff --git a/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java b/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java index 39a043e..4b7a625 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java @@ -22,10 +22,7 @@ import java.util.*; * Elle gère les axes actuels et le graphique de dispersion. */ public abstract class DataVisualizationView { - private static Set<DataVisualizationView> views = new HashSet<>(); - - public DataVisualizationController controller; private ScatterChart.Series series1; private ScatterChart.Series series2; @@ -49,7 +46,9 @@ public abstract class DataVisualizationView { views.add(this); } - + /** + * Réinitialisation des axes. + */ public static void resetEachAxis() { // call method resetAxis for each instance of DataVisualizationView (views) for(DataVisualizationView view : views) { @@ -57,6 +56,9 @@ public abstract class DataVisualizationView { } } + /** + * Réinitialisation des axes. + */ public void resetAxis(){ setActualY(""); setActualX(""); diff --git a/src/main/java/fr/univlille/sae/classification/view/KNNView.java b/src/main/java/fr/univlille/sae/classification/view/KNNView.java index 5df4057..6e3272c 100644 --- a/src/main/java/fr/univlille/sae/classification/view/KNNView.java +++ b/src/main/java/fr/univlille/sae/classification/view/KNNView.java @@ -11,15 +11,24 @@ import java.io.File; import java.io.IOException; import java.net.URL; +/** + * Classe représentant la vue de classification des données avec KNN. + */ public class KNNView { - + /** + * Modèle de classification utilisé pour gérer les données. + */ private ClassificationModel model; + + /** + * Fenêtre parente de la vue. + */ private Stage owner; /** * Constructeur de la vue de chargement des données. - * @param model modèle de classification à utiliser. - * @param owner fenêtre parente. + * @param model Modèle de classification à utiliser + * @param owner Fenêtre parente */ public KNNView(ClassificationModel model, Stage owner) { this.model = model; @@ -27,7 +36,7 @@ public class KNNView { } /** - * + * Charge le fichier FXML et initialise la scène. */ public void show() { FXMLLoader loader = new FXMLLoader(); diff --git a/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java b/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java index e7961d5..f1693fe 100644 --- a/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java +++ b/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java @@ -15,14 +15,20 @@ import java.net.URL; * Classe responsable de l'affichage de la vue de chargement des données. */ public class LoadDataView { - + /** + * Modèle de classification utilisé pour gérer les données. + */ private ClassificationModel model; + + /** + * Fenêtre parente de la vue. + */ private Stage owner; /** * Constructeur de la vue de chargement des données. - * @param model modèle de classification à utiliser. - * @param owner fenêtre parente. + * @param model Modèle de classification à utiliser + * @param owner Fenêtre parente */ public LoadDataView(ClassificationModel model, Stage owner) { this.model = model; @@ -30,7 +36,7 @@ public class LoadDataView { } /** - * Affiche la fenêtre de chargement des données. + * Charge le fichier FXML et initialise la scène. */ public void show() { FXMLLoader loader = new FXMLLoader(); diff --git a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java index 3666173..e451f23 100644 --- a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java @@ -27,10 +27,14 @@ import java.util.*; */ public class MainStageView extends DataVisualizationView implements Observer { - + /** + * Fenêtre de la vue principale. + */ private Stage root; - + /** + * Regroupements de points. + */ private ScatterChart.Series series1; private ScatterChart.Series series2; private ScatterChart.Series series3; -- GitLab