From c32d50418ce47ba102e2a6cf2f632fd1b7ebc82f Mon Sep 17 00:00:00 2001 From: Javier Fumanal Idocin Date: Wed, 26 Feb 2025 12:18:07 +0000 Subject: [PATCH] Fix --- ex_fuzzy/ex_fuzzy/eval_rules.py | 12 +++--- ex_fuzzy/ex_fuzzy/rules.py | 5 ++- ex_fuzzy/ex_fuzzy/utils.py | 65 +++++++++++++++++---------------- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/ex_fuzzy/ex_fuzzy/eval_rules.py b/ex_fuzzy/ex_fuzzy/eval_rules.py index c760434..4ab913f 100644 --- a/ex_fuzzy/ex_fuzzy/eval_rules.py +++ b/ex_fuzzy/ex_fuzzy/eval_rules.py @@ -103,7 +103,6 @@ def compute_pattern_support(self, X: np.array=None, y: np.array=None) -> np.arra antecedent_memberships = self.mrule_base.compute_firing_strenghts( data_X, self.time_moments) - patterns = self._get_all_rules() if self.mrule_base.fuzzy_type() == fs.FUZZY_SETS.t1: @@ -112,14 +111,17 @@ def compute_pattern_support(self, X: np.array=None, y: np.array=None) -> np.arra res = np.zeros((len(patterns), 2)) elif self.mrule_base.fuzzy_type() == fs.FUZZY_SETS.gt2: res = np.zeros((len(patterns), 2)) + consequents = self.mrule_base.get_consequents() for ix, pattern in enumerate(patterns): consequent_match = np.equal(data_y, consequents[ix]) + try: + consequent_match = np.array(consequent_match, dtype=int) + except: + pass pattern_firing_strength = antecedent_memberships[:, ix] - - - res[ix] = np.mean(pattern_firing_strength * consequent_match) + res[ix] = np.mean(pattern_firing_strength * consequent_match.reshape(-1, 1)) if self.mrule_base.fuzzy_type() == fs.FUZZY_SETS.t2 or self.mrule_base.fuzzy_type() == fs.FUZZY_SETS.gt2: res = np.mean(res, axis=1) @@ -214,8 +216,6 @@ def compute_pattern_confidence(self, X: np.array=None, y: np.array=None, precomp pattern_firing_strength = antecedent_memberships[:, ix] dem = np.sum(pattern_firing_strength) if dem == 0: - - res[ix] = 0 else: res[ix] = np.sum( diff --git a/ex_fuzzy/ex_fuzzy/rules.py b/ex_fuzzy/ex_fuzzy/rules.py index da7cd55..5192dab 100644 --- a/ex_fuzzy/ex_fuzzy/rules.py +++ b/ex_fuzzy/ex_fuzzy/rules.py @@ -1181,7 +1181,10 @@ def explainable_predict(self, X: np.array, out_class_names=False, precomputed_tr else: res[ix] = -1 - return np.array(res), winning_rules, winning_association_degrees, winning_rule_confidence_intervals * winning_association_degrees.reshape(len(winning_association_degrees),1) + if len(winning_association_degrees.shape) == 1: + winning_association_degrees = winning_association_degrees[:, None] + + return np.array(res), winning_rules, winning_association_degrees, np.array(winning_rule_confidence_intervals) * winning_association_degrees diff --git a/ex_fuzzy/ex_fuzzy/utils.py b/ex_fuzzy/ex_fuzzy/utils.py index bf1e73e..bf9becc 100644 --- a/ex_fuzzy/ex_fuzzy/utils.py +++ b/ex_fuzzy/ex_fuzzy/utils.py @@ -259,48 +259,49 @@ def t2_n_partition_parameters(x, n_partitions): ''' trap_memberships_size = 4 n_variables = x.shape[1] - quantile_numbers = compute_quantiles(x, n_partitions) + quantile_numbers = compute_quantiles(x, 4 + (n_partitions-2) * 2) # Initialize the array for partition parameters partition_parameters = np.zeros((n_variables, n_partitions, trap_memberships_size, 2)) + for partition in range(n_partitions): if partition == 0: # First partition - partition_parameters[:, partition, 0, 1] = quantile_numbers[0] - partition_parameters[:, partition, 1, 1] = quantile_numbers[0] - partition_parameters[:, partition, 2, 1] = quantile_numbers[1] - partition_parameters[:, partition, 3, 1] = quantile_numbers[2] - - partition_parameters[:, partition, 0, 0] = quantile_numbers[0] - partition_parameters[:, partition, 1, 0] = quantile_numbers[0] - partition_parameters[:, partition, 2, 0] = quantile_numbers[1] - partition_parameters[:, partition, 3, 0] = quantile_numbers[1] + \ - 0.9 * (quantile_numbers[2] - quantile_numbers[1]) - + partition_parameters[:, partition, 0, 0] = quantile_numbers[0, :] + partition_parameters[:, partition, 0, 1] = quantile_numbers[0, :] + + partition_parameters[:, partition, 1, 0] = quantile_numbers[0, :] + partition_parameters[:, partition, 1, 1] = quantile_numbers[0, :] + + partition_parameters[:, partition, 2, 0] = quantile_numbers[1, :] + partition_parameters[:, partition, 2, 1] = quantile_numbers[1, :] + + partition_parameters[:, partition, 3, 0] = quantile_numbers[2, :] - (quantile_numbers[2, :] - quantile_numbers[1, :]) / 2 + partition_parameters[:, partition, 3, 1] = quantile_numbers[2, :] elif partition == n_partitions - 1: # Last partition - partition_parameters[:, partition, 0, 1] = quantile_numbers[partition] - partition_parameters[:, partition, 1, 1] = quantile_numbers[partition + 1] - partition_parameters[:, partition, 2, 1] = quantile_numbers[partition + 2] - partition_parameters[:, partition, 3, 1] = quantile_numbers[partition + 2] + partition_parameters[:, partition, 0, 1] = quantile_numbers[-3, :] + partition_parameters[:, partition, 0, 0] = quantile_numbers[-3, :] + (quantile_numbers[-2, :] - quantile_numbers[-3, :]) / 2 + + partition_parameters[:, partition, 1, 0] = quantile_numbers[-2, :] + partition_parameters[:, partition, 1, 1] = quantile_numbers[-2, :] - partition_parameters[:, partition, 0, 0] = quantile_numbers[partition] + \ - 0.1 * (quantile_numbers[partition + 1] - quantile_numbers[partition]) - partition_parameters[:, partition, 1, 0] = quantile_numbers[partition + 1] - partition_parameters[:, partition, 2, 0] = quantile_numbers[partition + 2] - partition_parameters[:, partition, 3, 0] = quantile_numbers[partition + 2] + partition_parameters[:, partition, 2, 0] = quantile_numbers[-1, :] + partition_parameters[:, partition, 2, 1] = quantile_numbers[-1, :] + partition_parameters[:, partition, 3, 0] = quantile_numbers[-1, :] + partition_parameters[:, partition, 3, 1] = quantile_numbers[-1, :] else: # Intermediate partitions - partition_parameters[:, partition, 0, 1] = quantile_numbers[partition, :] - partition_parameters[:, partition, 1, 1] = (quantile_numbers[partition, :] + quantile_numbers[partition + 1, :] ) / 2 - partition_parameters[:, partition, 2, 1] = (quantile_numbers[partition + 1, :] + quantile_numbers[partition + 2, :] ) / 2 - partition_parameters[:, partition, 3, 1] = quantile_numbers[partition + 2, :] - - partition_parameters[:, partition, 0, 0] = quantile_numbers[partition] + \ - 0.1 * (quantile_numbers[partition + 1] - quantile_numbers[partition]) - partition_parameters[:, partition, 1, 0] = (quantile_numbers[partition, :] + quantile_numbers[partition + 1, :] ) / 2 - partition_parameters[:, partition, 2, 0] = (quantile_numbers[partition + 1, :] + quantile_numbers[partition + 2, :] ) / 2 - partition_parameters[:, partition, 3, 0] = ((quantile_numbers[partition + 1, :] + quantile_numbers[partition + 2, :] ) / 2) + \ - 0.9 * (quantile_numbers[partition + 2] - ((quantile_numbers[partition + 1, :] + quantile_numbers[partition + 2, :] ) / 2)) + partition_parameters[:, partition, 0, 1] = quantile_numbers[1 + 2*(partition-1), :] + partition_parameters[:, partition, 0, 0] = quantile_numbers[1 + 2*(partition-1), :] + (quantile_numbers[1 + 2*(partition-1) + 2, :] - quantile_numbers[1 + 2*(partition-1), :]) / 2 + + partition_parameters[:, partition, 1, 0] = quantile_numbers[1 + 2*(partition-1) + 1, :] + partition_parameters[:, partition, 1, 1] = quantile_numbers[1 + 2*(partition-1) + 1, :] + + partition_parameters[:, partition, 2, 0] = quantile_numbers[1 + 2*(partition-1) + 2, :] + partition_parameters[:, partition, 2, 1] = quantile_numbers[1 + 2*(partition-1) + 2, :] + + partition_parameters[:, partition, 3, 0] = quantile_numbers[1 + 2*(partition-1) + 3, :] - (quantile_numbers[1 + 2*(partition-1) + 3, :] - quantile_numbers[1 + 2*(partition-1) + 2, :]) / 2 + partition_parameters[:, partition, 3, 1] = quantile_numbers[1 + 2*(partition-1) + 3, :] return partition_parameters