@@ -696,29 +696,25 @@ def predict(self, X):
696696
697697 def aggregate (self , predictions , train_y_values ):
698698
699- pos_predictions = predictions [:, 1 ]
700- m = self . get_best_merging_factor ( pos_predictions )
699+ prevalence , _ , _ = self . best_mixture ( predictions )
700+ prevalences = np . asarray ([ 1 - prevalence , prevalence ] )
701701
702702 self .classes = self .classes if hasattr (self , 'classes' ) else np .unique (train_y_values )
703-
704- moss_scores , moss_labels = self .MoSS (1000 , 0.5 , m )
705-
706- prevalences = self .quantifier .aggregate (predictions ,
707- moss_scores ,
708- moss_labels )
709703
710- prevalences = { self . classes [ i ]: v for i , v in enumerate ( prevalences . values ())}
704+ prevalences = validate_prevalences ( self , prevalences , self . classes )
711705 return prevalences
712706
713707
714- def get_best_merging_factor (self , predictions ):
708+ def best_mixture (self , predictions ):
709+ predictions = predictions [:, 1 ]
715710
716711 MF = np .atleast_1d (np .round (self .merging_factors , 2 )).astype (float )
717712
718713 distances = []
714+ alphas = []
719715
720716 for mf in MF :
721- scores , labels = self .MoSS (1000 , 0.5 , mf )
717+ scores , labels = self .MoSS (n = 1000 , alpha = 0.5 , merging_factor = mf )
722718 pos_scores = scores [labels == 1 ][:, 1 ]
723719 neg_scores = scores [labels == 0 ][:, 1 ]
724720
@@ -727,34 +723,25 @@ def get_best_merging_factor(self, predictions):
727723 elif self .measure == "sord" :
728724 method = SORD ()
729725
730- best_distance = method .get_best_distance (predictions , pos_scores , neg_scores )
726+ alpha , distance = method .best_mixture (predictions , pos_scores , neg_scores )
731727
732- distances .append (best_distance )
728+ distances .append (distance )
729+ alphas .append (alpha )
733730
734731 best_m = MF [np .argmin (distances )]
735- return best_m
732+ best_alpha = alphas [np .argmin (distances )]
733+ best_distance = np .min (distances )
734+ return best_alpha , best_distance , best_m
736735
737736 def get_best_distance (self , predictions ):
738737
739- pos_predictions = predictions [:, 1 ]
740- m = self .get_best_merging_factor (pos_predictions )
741-
742- scores , labels = self .MoSS (1000 , 0.5 , m )
743-
744- pos_scores = scores [labels == 1 ][:, 1 ]
745- neg_scores = scores [labels == 0 ][:, 1 ]
746-
747- if self .measure in ["hellinger" , "topsoe" , "probsymm" ]:
748- method = DyS (measure = self .measure )
749- elif self .measure == "sord" :
750- method = SORD ()
738+ _ , distance , _ = self .get_best_merging_factor (predictions )
751739
752- best_distance = method .get_best_distance (predictions , pos_scores , neg_scores )
753- return best_distance
740+ return distance
754741
755742
756743 @classmethod
757- def MoSS (cls , n , alpha , m ):
744+ def MoSS (cls , n , alpha , merging_factor ):
758745 r"""Model for Score Simulation
759746
760747 Parameters
@@ -797,9 +784,9 @@ def MoSS(cls, n, alpha, m):
797784 n_neg = n - n_pos
798785
799786 # Scores positivos
800- p_score = np .random .uniform (size = n_pos ) ** m
787+ p_score = np .random .uniform (size = n_pos ) ** merging_factor
801788 # Scores negativos
802- n_score = 1 - (np .random .uniform (size = n_neg ) ** m )
789+ n_score = 1 - (np .random .uniform (size = n_neg ) ** merging_factor )
803790
804791 # Construção dos arrays de features (duas colunas iguais)
805792 moss = np .column_stack (
0 commit comments