コード例 #1
0
ファイル: id3.py プロジェクト: 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
コード例 #2
0
	def test_cuando_arbol_no_vacio_es_false(self):
		arbol = Arbol(2)

		self.assertFalse(arbol.vacio())
コード例 #3
0
	def test_cuando_arbol_vacio_es_true(self):
		arbol = Arbol()

		self.assertTrue(arbol.vacio())
コード例 #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)
コード例 #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])		
コード例 #6
0
	def test_inorder_de_arbol_vacio_es_vacio(self):
		arbol = Arbol()

		self.assertEqual(arbol.inorder(), [])
コード例 #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])		
コード例 #8
0
ファイル: solucion.py プロジェクト: Diiru/syllabus
    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)
コード例 #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])		
コード例 #10
0
ファイル: gramaticasql.py プロジェクト: 27Pablooliva27/tytus
def p_init(p):
    'init : instrucciones'
    #p[0] = [p[1]]
    p[0] = Arbol(p[1])
コード例 #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')
コード例 #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))
コード例 #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': '-',
コード例 #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)
コード例 #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)
コード例 #16
0
	def test_devuelve_la_raiz(self):
		arbol = Arbol(2)

		self.assertEqual(arbol.raiz(), 2)
コード例 #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)
コード例 #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)