ml-hero/Model/Criteria.py
2018-11-18 17:04:03 +01:00

58 lines
2.3 KiB
Python
Executable file

# -*-coding:utf8 -*
from math import log
class Criteria :
"""Classe Critère - valeurs d'un critère pour l'éléments recherché"
Attributs :
@string name = nom du critère
@dict{@dict{@int} values = totaux des correspondances des différentes valeurs pour ce critère
"""
def __init__(self, criteriaList, referenceList):
"""Constructeur - liste les valeurs possibles du critère """
# Definition du nom et suppression des header de la liste
self.name = criteriaList[0]
self.referenceList = referenceList.copy()
self.criteriaList = criteriaList.copy()
del self.criteriaList[0]
del self.referenceList[0]
# Définition des différentes valeurs
self.values = {}
for key, value in enumerate(self.criteriaList):
# Ajout de la valeur si nouvelle
if value not in self.values.keys():
self.values[value] = {"True": 0, "False": 0}
# Et incrément de la valeur du critère correspondant à l'élément de référence recherché
if self.referenceList[key] == "O" or self.referenceList[key] is True or self.referenceList[key] == "Oui":
self.values[value]["True"] += 1
elif self.referenceList[key] == "N" or self.referenceList[key] is False or self.referenceList[key] == "Non":
self.values[value]["False"] += 1
def get_entropy(self):
"""Calcule et retourne l'entropie du critère"""
# On récupère les totaux
totals = {"all": 0}
for key, value in self.values.items():
totals[key] = value["True"] + value["False"]
totals["all"] += totals[key]
# Maintenant qu'on a tout ce qu'il nous faut, on peut lancer le calcul !
entropy = 0
for key, value in self.values.items():
entropy += totals[key]/totals["all"] \
* ((self._entropy_frag(value["True"]/totals[key]))
+ (self._entropy_frag(value["False"]/totals[key])))
return entropy
@staticmethod
def _entropy_frag(prob):
"""Un morceau du calcul d'entropie, permet d'alléger la formule"""
if prob == 0:
return 0
return -1 * prob * (log(prob)/log(2))