diff --git a/src/Learning/KWDataPreparation/KWDataGridOptimizer.cpp b/src/Learning/KWDataPreparation/KWDataGridOptimizer.cpp index 1d3a7709e..43941de4f 100644 --- a/src/Learning/KWDataPreparation/KWDataGridOptimizer.cpp +++ b/src/Learning/KWDataPreparation/KWDataGridOptimizer.cpp @@ -107,7 +107,7 @@ double KWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGrid, // CH IV Refactoring : DDDDD // Test du remplacement de la methode actuelle, par son proto - boolean bNewPROTO = false; + boolean bNewPROTO = true; if (bNewPROTO) { NEWKWDataGridOptimizer newDataGridOptimizer; diff --git a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp index 874a1f806..38c1badb5 100644 --- a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp +++ b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.cpp @@ -82,8 +82,6 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri double dBestCost; double dTotalTime; int nGranularityIndex; - int nGranularityMax; - int nValueNumber; boolean bIsLastGranularity; boolean bOptimizationNeeded; boolean bWithMemoryMode; @@ -94,8 +92,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri boolean bIsGranularitySelected; double dRequiredIncreasingCoefficient; IntVector ivMaxPartNumbers; - int nMinValueNumber = 500; - boolean bIsGranularityMaxThresholded; + int nMaxExploredGranularity; double dBestMergedCost; double dMergedCost; KWDataGrid granularizedPostMergedOptimizedDataGrid; @@ -105,10 +102,10 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri int nLastExploredGranularity; ALString sTmp; + //Initialisations dGranularityBestCost = DBL_MAX; dBestMergedCost = dGranularityBestCost; dTotalTime = 0; - nValueNumber = initialDataGrid->GetGridFrequency(); bWithMemoryMode = false; // Controle de la graine aleatoire pour avoir des resultats reproductibles @@ -138,34 +135,8 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri // Cas ou la grille terminale est ameliorable if (bOptimizationNeeded) { - // On parcourt les differentes granularites - - // Initialisation de la granularite maximale avec seuillage eventuel de la granularite max pour reduire - // la complexite algorithmique - bIsGranularityMaxThresholded = false; - // Cas d'une une grille 2D supervise avec un attribut a predire avec groupage de la cible - // (classification avec groupage ou regression) et un attribut explicatif numerique dont le nombre de - // valeurs potentielle (= nombre d'instances) est > nMinValueNumber - if (initialDataGrid->GetTargetAttribute() != NULL and initialDataGrid->GetTargetValueNumber() == 0 and - initialDataGrid->GetAttributeNumber() == 2 and - initialDataGrid->GetAttributeAt(0)->GetAttributeType() == KWType::Continuous and - (nValueNumber > nMinValueNumber)) - bIsGranularityMaxThresholded = true; - // Cas d'une classification supervisee simple avec une paire de variables (numerique ou categorielle) - // pour lesquelles le nombre de valeurs potentielles (= nombre d'instances) est > nMinValueNumber - else if (initialDataGrid->GetTargetValueNumber() > 0 and initialDataGrid->GetAttributeNumber() == 2 and - nValueNumber > nMinValueNumber) - bIsGranularityMaxThresholded = true; - - // Cas sans seuillage - if (not bIsGranularityMaxThresholded) - nGranularityMax = (int)ceil(log(nValueNumber * 1.0) / log(2.0)); - // Sinon seuillage - else - nGranularityMax = - (int)ceil(log(nMinValueNumber + sqrt((nValueNumber - nMinValueNumber) * - log(nValueNumber - nMinValueNumber) / log(2.0))) / - log(2.0)); + // Calcul de la granularite max a explorer + nMaxExploredGranularity = ComputeMaxExploredGranularity(initialDataGrid); // Initialisation nGranularityIndex = 1; @@ -190,7 +161,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri nLastExploredGranularity = -1; // Parcours des granularites - while (nGranularityIndex <= nGranularityMax and not bIsLastGranularity) + while (nGranularityIndex <= nMaxExploredGranularity and not bIsLastGranularity) { // Arret si interruption utilisateur if (TaskProgression::IsInterruptionRequested()) @@ -213,7 +184,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri bIsLastGranularity = true; // Si on n'a pas encore atteint la granularite max - if (nGranularityIndex < nGranularityMax) + if (nGranularityIndex < nMaxExploredGranularity) { for (nAttribute = 0; nAttribute < granularizedDataGrid.GetAttributeNumber(); nAttribute++) @@ -232,7 +203,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri if (bIsLastGranularity) // On positionne l'index de granularite au maximum afin que l'affichage soit adapte a ce // cas - granularizedDataGrid.SetGranularity(nGranularityMax); + granularizedDataGrid.SetGranularity(nMaxExploredGranularity); bIsGranularitySelected = false; for (nAttribute = 0; nAttribute < granularizedDataGrid.GetAttributeNumber(); nAttribute++) @@ -469,7 +440,7 @@ double NEWKWDataGridOptimizer::OptimizeDataGrid(const KWDataGrid* initialDataGri "All the optimization time has been used but maximum " "granularity has not been reached:" + IntToString(nGranularityIndex) + " on " + - IntToString(nGranularityMax) + + IntToString(nMaxExploredGranularity) + ". You could obtain better results with greater " "optimization time."); if (bDisplayResults) @@ -556,6 +527,47 @@ double NEWKWDataGridOptimizer::SimplifyDataGrid(KWDataGrid* optimizedDataGrid) c return dSimplifiedGridCost; } +int NEWKWDataGridOptimizer::ComputeMaxExploredGranularity(const KWDataGrid* initialDataGrid) const +{ + int nMaxExploredGranularity; + const int nMinValueNumber = 500; + int nValueNumber; + boolean bIsGranularityMaxThresholded; + + require(initialDataGrid != NULL); + + // Nombre total de valeurs potentielles, base sur le nombre d'individus de la grille + nValueNumber = initialDataGrid->GetGridFrequency(); + + // Seuillage eventuel de la granularite max pour reduire la complexite algorithmique, + // (sauf dans le cas des petits nombre de valeurs) + bIsGranularityMaxThresholded = false; + if (nValueNumber > nMinValueNumber) + { + // Cas d'une grille 2D supervise avec un attribut a predire avec groupage de la cible + // (classification avec groupage ou regression) et un attribut explicatif numerique + if (initialDataGrid->GetTargetAttribute() != NULL and initialDataGrid->GetTargetValueNumber() == 0 and + initialDataGrid->GetAttributeNumber() == 2 and + initialDataGrid->GetAttributeAt(0)->GetAttributeType() == KWType::Continuous) + bIsGranularityMaxThresholded = true; + // Cas d'une classification supervisee simple avec une paire de variables (numerique ou categorielle) + else if (initialDataGrid->GetTargetValueNumber() > 0 and initialDataGrid->GetAttributeNumber() >= 2 and + nValueNumber > nMinValueNumber) + bIsGranularityMaxThresholded = true; + } + + // Cas sans seuillage + if (not bIsGranularityMaxThresholded) + nMaxExploredGranularity = (int)ceil(log(nValueNumber * 1.0) / log(2.0)); + // Sinon seuillage + else + nMaxExploredGranularity = + (int)ceil(log(nMinValueNumber + sqrt((nValueNumber - nMinValueNumber) * + log(nValueNumber - nMinValueNumber) / log(2.0))) / + log(2.0)); + return nMaxExploredGranularity; +} + double NEWKWDataGridOptimizer::OptimizeGranularizedDataGrid(const KWDataGrid* initialDataGrid, KWDataGrid* optimizedDataGrid, boolean bIsLastGranularity, double& dTotalComputeTime) const diff --git a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h index 0f5b421fa..bada5834f 100644 --- a/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h +++ b/src/Learning/KWDataPreparation/NEWKWDataGridOptimizer.h @@ -107,6 +107,11 @@ class NEWKWDataGridOptimizer : public Object // CH IV Refactoring: a supprimer friend class KWDataGridOptimizer; + // Calcul de la granularite max a explorer + // Celle-ci depend du nombre de valeurs, mais est egalement tronquee de facon heuristique + // dans certains cas (ex: regression) pour reduire les temps de calcul + int ComputeMaxExploredGranularity(const KWDataGrid* initialDataGrid) const; + // Optimisation d'une grille pour la granularite courante // Ajout arguments bIsLastGranularity et dTotalComputeTime double OptimizeGranularizedDataGrid(const KWDataGrid* initialDataGrid, KWDataGrid* optimizedDataGrid,