Ejemplo n.º 1
0
Archivo: id3.py Proyecto: gsiriani/MAA
    def ejecutar(self, ejemplos, atributos, maxDepth = None):
        '''
        Se ejecuta el algoritmo sobre la lista de datos "ejemplos", considerando los
        atributos "atributos".
        El algoritmo retorna un arbol de decision, de profundidad maxDepth (si no se
            especifica se considera profundidad infinita).
        '''

        objetivo = self.atributoObjetivo

        # Evaluo el caso en que todos los casos de prueba restantes tienen el mismo
        # valor en el atributo objetivo
        if len(set([e[objetivo] for e in ejemplos])) == 1:
            # Retorno una hoja de tipo UNICO con el unico valor posible de G3
            return Arbol(ejemplos[0][objetivo], TipoHijo.UNICO)

        # Evaluo el caso en que no me quedan atributos por considerar o alcance la
        # profundidad maxima estipulada para el arbol de decision
        if len(atributos) == 0 or (maxDepth is not None and maxDepth <= 0):
            # Retorno una hoja de tipo MAYORIA, cuyo valor es el valor de mayor
            # frecuencia entre los ejemplos restantes
            return Arbol(self.obtenerValorMasComun(ejemplos), TipoHijo.MAYORIA)

        # Obtengo el mejor clasificador local y su ganancia asociada
        mejorAtributo, ganancia = self.obtenerMejorClasificador(ejemplos, atributos)

        # Remuevo el atributo seleccionado de la lista de atributos a considerar
        nuevosAtributos = list(atributos)
        nuevosAtributos.remove(mejorAtributo)

        # Creo el nodo raiz. Las ganancias almacenadas son para uso estadistico
        a = Arbol(mejorAtributo)
        a.ganancia = ganancia
        sumaGanancias = sum([g[1] for g in self.obtenerGanancias(ejemplos, atributos)])
        a.gananciaRelativa =  ganancia /  sumaGanancias if sumaGanancias != 0 else 0

        for v in self.valoresPosibles[mejorAtributo]:
        # Para cada valor posible del atributo seleccionado, ejecuto un paso del algoritmo
        # y almaceno el arbol resultante en una de las ramas del arbol
            ejemplos_aux = [e for e in ejemplos if e[mejorAtributo]==v]

            if len(ejemplos_aux) != 0:

                rama = self.ejecutar(ejemplos_aux, nuevosAtributos, maxDepth - 1 if maxDepth is not None else None)
                a.agregarRama(v, rama)

            else:

                a.agregarRama(v, Arbol(self.obtenerValorMasComun(ejemplos), TipoHijo.ELSE))

        return a
Ejemplo n.º 2
0
	def test_cuando_arbol_no_vacio_es_false(self):
		arbol = Arbol(2)

		self.assertFalse(arbol.vacio())
Ejemplo n.º 3
0
	def test_cuando_arbol_vacio_es_true(self):
		arbol = Arbol()

		self.assertTrue(arbol.vacio())
Ejemplo n.º 4
0
	def test_dos_arboles_distintos_es_false(self):
		arbol = Arbol(1, Arbol(2, Arbol(4), Arbol(5)), Arbol(3, Arbol(6), Arbol(7)))
		otro_arbol = Arbol(1, Arbol(8, Arbol(9), Arbol(13)), Arbol(23, Arbol(65), Arbol(337)))

		self.assertNotEqual(arbol, otro_arbol)
Ejemplo n.º 5
0
	def test_inorder_esperado(self):
		arbol = Arbol(1, Arbol(2, Arbol(4), Arbol(5)), Arbol(3, Arbol(6), Arbol(7)))

		self.assertEqual(arbol.inorder(), [4, 2, 5, 1, 6, 3, 7])		
Ejemplo n.º 6
0
	def test_inorder_de_arbol_vacio_es_vacio(self):
		arbol = Arbol()

		self.assertEqual(arbol.inorder(), [])
Ejemplo n.º 7
0
	def test_posorder_esperado(self):
		arbol = Arbol(1, Arbol(2, Arbol(4), Arbol(5)), Arbol(3, Arbol(6), Arbol(7)))

		self.assertEqual(arbol.posorder(), [7, 6, 3, 5, 4, 2, 1])		
Ejemplo n.º 8
0
    else:
        for hijo in arbol.hijos:
            if arbol.hijos[hijo] is not None:
                get_outcome(arbol.hijos[hijo])

def get_entradas(subconjunto, mov_pocmon, fantasmas):
    sub_subconjunto = []
    for fantasma, mov_fantasma in fantasmas:
        for entrada in subconjunto:
            if entrada[-1] == mov_pocmon and entrada[fantasma.nombre] == mov_fantasma:
                sub_subconjunto.append(entrada)
    return sub_subconjunto



for k, v in datos_agrupados.items():
    print(k, v)


results = []
fantasma_root = Arbol(0)
crear_arbol(fantasma_root, 4)

fantasma_root.print(0)
get_miedo(fantasma_root)
print(miedo)
r = dict(sorted(miedo.items(), key=operator.itemgetter(1)))
print(r)

get_outcome(fantasma_root)
print(outcomes)
Ejemplo n.º 9
0
	def test_preorder_esperado(self):
		arbol = Arbol(1, Arbol(2, Arbol(4), Arbol(5)), Arbol(3, Arbol(6), Arbol(7)))

		self.assertEqual(arbol.preorder(), [1, 2, 4, 5, 3, 6, 7])		
Ejemplo n.º 10
0
def p_init(p):
    'init : instrucciones'
    #p[0] = [p[1]]
    p[0] = Arbol(p[1])
Ejemplo n.º 11
0
def ej_prof():

    b1 = Bosque()        # el bosque vacío

    #                       _nodo
    #   b1: ---------      --------
    #       |   *---|----->| None |
    #       ---------      --------

    assert(len(b1) == 0), "--> Error en __len__ de bosque"

    a1 = Arbol(10, b1)     # plantar el árbol
    print(b1)

    #                       _nodo           _valor _primog _sig_herm
    #   a1: ---------      ----------      --------------------------
    #       |   *---|----->|   *----|----->|  10  |   *   |  None   |
    #       ---------      ----------      -----------|--------------
    #                                                 |
    #                                                 v
    #                                               _nodo (apuntado por b1)
    #                                              --------
    #                                              | None |
    #                                              --------

    assert(a1.raiz() == 10), "--> Error en raíz() de árbol"
    assert(len(a1.hijos()) == 0), "--> Error en hijos() de árbol"
    assert(a1.num_hijos() == 0), "--> Error en núm_hijos() de árbol"
    assert(a1.es_hoja_()), "--> Error en es_hoja_() de árbol"

    b1.add_arbol(a1)     # añadir el árbol al bosque

    #                       _nodo           _valor _primog _sig_herm
    #   a1: ---------      ----------      --------------------------
    #       |   *---|----->|   *----|----->|  10  |   *   |  None   |
    #       ---------      ----------      -----------|--------------
    #                                      ^          |
    #                                      |          v
    #                       _nodo          |        _nodo (ya no apuntado por b1)
    #   b1: ---------      ----------      |       --------
    #       |   *---|----->|   *----|------|       | None |
    #       ---------      ----------              --------

    assert(len(b1) == 1), "--> Error en __len__ de bosque"

    a2 = Arbol(20, b1)     # plantar el árbol

    #                       _nodo           _valor _primog _sig_herm
    #   a2: ---------      ----------      --------------------------
    #       |   *---|----->|   *----|----->|  20  |   *   |  None   |
    #       ---------      ----------      -----------|--------------
    #                                                 |
    #                                                 v
    #                                               _nodo (apuntado por b1)
    #                                              --------
    #                                              |  *---|-----> _valor (10)
    #                                              --------

    assert(a2.raiz() == 20), "--> Error en raíz() de árbol"
    assert(len(a1.hijos()) == 1), "--> Error en hijos() de árbol"
    assert(a1.num_hijos() == 1), "--> Error en núm_hijos() de árbol"
    assert(not a1.es_hoja_()), "--> Error en es_hoja_() de árbol"

    b3 = Bosque()         # el bosque vacío
    a3 = Arbol(30, b3)     # plantar el árbol
    b3.add_arbol(a3)

    #                       _nodo           _valor _primog _sig_herm
    #   a3: ---------      ----------      --------------------------
    #       |   *---|----->|   *----|----->|  30  |   *   |  None   |
    #       ---------      ----------      -----------|--------------
    #                                                 |
    #                                                 v
    #                                               _nodo (apuntado por b3)
    #                                              --------
    #                                              | None |
    #                                              --------

    b4 = Bosque()         # el bosque vacío
    a4 = Arbol(40, b4)     # plantar el árbol

    b5 = Bosque()         # el bosque vacío
    b5.add_arbol(a3)       # añadir el árbol al bosque
    assert(len(b5) == 1), "--> Error en __len__ de bosque"

    b5.add_arbol(a4)       # añadir el árbol al bosque
    assert(len(b5) == 2), "--> Error en __len__ de bosque"

    a5 = Arbol(50, b5)     # plantar el árbol
    assert(a5.raiz() == 50), "--> Error en raíz() de árbol"
    assert(len(a5.hijos()) == 2), "--> Error en hijos() de árbol"
    assert(a5.num_hijos() == 2), "--> Error en núm_hijos() de árbol"
    assert(not a5.es_hoja_()), "--> Error en es_hoja_() de árbol"

    # try:
    #     print(b5[0])
    # except AssertionError:
    #     pass

    assert(b5[1].raiz() == 40), "--> Error en añ_árbol() de bosque"
    assert(b5[2].raiz() == 30), "--> Error en añ_árbol() de bosque"

    print('All tests are ok')
Ejemplo n.º 12
0
def main():
    # Primero se crea el bosque
    b_a = Bosque()
    # Luego el arbol que contendra al bosque
    a_a = Arbol('A', b_a)

    b_b = Bosque()
    a_b = Arbol('B', b_b)
    b_c = Bosque()
    a_c = Arbol('C', b_c)
    b_d = Bosque()
    a_d = Arbol('D', b_d)

    b_a.add_arbol(a_b)
    b_a.add_arbol(a_c)
    b_a.add_arbol(a_d)
    assert a_c.es_hoja_(), 'C no es un bosque vacio'
    assert len(b_a) == 3, '--> Error al agregar los arboles B,C,D al bosque'

    b_e = Bosque()
    a_e = Arbol('E', b_e)

    b_f = Bosque()
    a_f = Arbol('F', b_f)

    b_b.add_arbol(a_e)
    b_b.add_arbol(a_f)
    assert a_e.es_hoja_(), 'E no es un bosque vacio'
    assert len(b_b) == 2, '--> Error al agregar los arboles E,F al bosque'

    b_j = Bosque()
    a_j = Arbol('J', b_j)
    b_k = Bosque()
    a_k = Arbol('K', b_k)
    b_l = Bosque()
    a_l = Arbol('L', b_l)

    b_f.add_arbol(a_j)
    b_f.add_arbol(a_k)
    b_f.add_arbol(a_l)
    assert len(b_f) == 3, '--> Error al agregar los arboles J,K,L al bosque'

    b_g = Bosque()
    a_g = Arbol('G', b_g)
    b_h = Bosque()
    a_h = Arbol('H', b_h)
    b_i = Bosque()
    a_i = Arbol('I', b_i)

    b_d.add_arbol(a_g)
    b_d.add_arbol(a_h)
    b_d.add_arbol(a_i)
    assert a_h.es_hoja_(), 'C no es un bosque vacio'
    assert len(b_d) == 3, '--> Error al agregar los arboles J,K,L al bosque'

    b_m = Bosque()
    a_m = Arbol('M', b_m)

    b_g.add_arbol(a_m)
    assert len(b_g) == 1, '--> Error al agregar el arbol G al bosque'

    b_p = Bosque()
    a_p = Arbol('P', b_p)
    b_q = Bosque()
    a_q = Arbol('Q', b_q)

    b_m.add_arbol(a_p)
    b_m.add_arbol(a_q)
    assert len(b_m) == 2, '--> Error al agregar los arboles P,Q al bosque'

    b_n = Bosque()
    a_n = Arbol('N', b_n)
    b_o = Bosque()
    a_o = Arbol('O', b_o)

    b_i.add_arbol(a_n)
    b_i.add_arbol(a_o)
    assert len(b_i) == 2, '--> Error al agregar los arboles N,O al bosque'

    print("Numero de nodos: %d" % num_nodos(a_a))
    print("Numero de hojas :%d" % num_hojas(a_a))
    print("Maximo grado: %d" % grado(a_a))
    print("Altura del arbol: %d" % altura(a_a))
    print('Recorrido preorden: ', end='')
    print(preorden(a_a))
    print('Recorrido postorden: ', end='')
    print(postorden(a_a))
    print('Recorrido niveles: ', end='')
    print(niveles(a_a))
    print('Recorrido frontera: ', end='')
    print(frontera(a_a))
Ejemplo n.º 13
0
from arbol import Arbol
from ordenar import Ordenar
arbol = Arbol()

criatura = {
    'name': 'Ceto',
    'derrotado': '-',
    'descripcion': '-',
    'capturado': 'Trueno'
}
arbol = arbol.insertar_nodo(criatura['name'], criatura)
criatura = {
    'name': 'Tifón',
    'derrotado': 'Zeus',
    'descripcion': '-',
    'capturado': 'Sol'
}
arbol = arbol.insertar_nodo(criatura['name'], criatura)
criatura = {
    'name': 'Equidna',
    'derrotado': 'Argos Panoptes',
    'descripcion': '-',
    'capturado': 'Mar'
}
arbol = arbol.insertar_nodo(criatura['name'], criatura)
criatura = {'name': 'Enio', 'derrotado': '-'}
arbol = arbol.insertar_nodo(criatura['name'], criatura)
criatura = {
    'name': 'Medusa',
    'derrotado': 'Perseo',
    'descripcion': '-',
Ejemplo n.º 14
0
    else:
        for hijo in arbol.hijos:
            if arbol.hijos[hijo] is not None:
                get_outcome(arbol.hijos[hijo])


def get_entradas(subconjunto, mov_pocmon, fantasmas):
    sub_subconjunto = []
    for fantasma, mov_fantasma in fantasmas:
        for entrada in subconjunto:
            if entrada[-1] == mov_pocmon and entrada[
                    fantasma.nombre] == mov_fantasma:
                sub_subconjunto.append(entrada)
    return sub_subconjunto


for k, v in datos_agrupados.items():
    print(k, v)

results = []
fantasma_root = Arbol(0)
crear_arbol(fantasma_root, 4)

fantasma_root.print(0)
get_miedo(fantasma_root)
print(miedo)
r = dict(sorted(miedo.items(), key=operator.itemgetter(1)))
print(r)

get_outcome(fantasma_root)
print(outcomes)
Ejemplo n.º 15
0
from arbol import Arbol

tabla = [['Despejado', 0.22], ['Nublado', 0.15], ['Lluvia',0.03], ['Baja', 0.26], ['Alta', 0.14], ['1', 0.05], ['2', 0.01],['3', 0.035], ['5', 0.06],['7', 0.02], ['8',0.025]]

dic = {}


def como_comparo(arbol):
    return arbol.frecuencia


bosque = []

for info, frecuencia in tabla:
    arbol = Arbol(info, frecuencia)
    bosque.append(arbol)


bosque.sort(key=como_comparo) 
for arbol in bosque:
     print(arbol.info, arbol.frecuencia)

while(len(bosque) > 1):
    arbol1 = bosque.pop(0)
    arbol2 = bosque.pop(0)
    nuevo_arbol = Arbol(frecuencia=arbol1.frecuencia+arbol2.frecuencia)
    nuevo_arbol.izq = arbol1
    nuevo_arbol.der = arbol2
    bosque.append(nuevo_arbol)
    bosque.sort(key=como_comparo)
Ejemplo n.º 16
0
	def test_devuelve_la_raiz(self):
		arbol = Arbol(2)

		self.assertEqual(arbol.raiz(), 2)
Ejemplo n.º 17
0
	def test_dos_arboles_iguales_es_true(self):
		arbol = Arbol(1, Arbol(2, Arbol(4), Arbol(5)), Arbol(3, Arbol(6), Arbol(7)))
		otro_arbol = Arbol(1, Arbol(2, Arbol(4), Arbol(5)), Arbol(3, Arbol(6), Arbol(7)))

		self.assertEqual(arbol, otro_arbol)
Ejemplo n.º 18
0
from arbol import Arbol
from random import randint

arbol = Arbol()

for i in range(10):
    numero = randint(1000, 9999)
    arbol.insertar_nodo(numero)
contpares=0
contimpares=0
if (arbol.info%2==0):
     contpares+=1
else:
     contimpares+=1

print(contpares)
print(contimpares)