Se necesita ayuda para crear una tabla de verdad dada de árbol binario
Primero, para proporcionar una divulgación completa, quiero señalar que esto está relacionado con la tarea en una clase de Aprendizaje Automático. Esta pregunta no es la tarea de la tarea y, en cambio, es algo que debo resolver para completar el mayor problema de la creación de un algoritmo de árbol de decisión ID3.
Necesito generar un árbol similar al siguiente cuando se me da una tabla de verdad
let learnedTree = Node(0,"A0", Node(2,"A2", Leaf(0), Leaf(1)), Node(1,"A1", Node(2,"A2", Leaf(0), Leaf(1)), Leaf(0)))
learnTree es de tipo BinaryTree que he definido de la siguiente manera:
type BinaryTree =
| Leaf of int
| Node of int * string * BinaryTree * BinaryTree
Los algoritmos ID3 toman en cuenta varias ecuaciones para determinar dónde dividir el árbol, y tengo todo lo resuelto, solo estoy teniendo problemas para crear el árbol aprendido de mi tabla de verdad. Por ejemplo si tengo la siguiente tabla
A1 | A2 | A3 | Class
1 0 0 1
0 1 0 1
0 0 0 0
1 0 1 0
0 0 0 0
1 1 0 1
0 1 1 0
Y decido dividirme en el atributo A1, terminaría con lo siguiente:
(A1 = 1) A1 (A1 = 0)
A2 | A3 | Class A2 | A3 | Class
0 0 1 1 0 1
0 1 0 0 0 0
1 0 1 0 0 0
0 1 1
Luego dividiría el lado izquierdo y el lado derecho, y continuaría el patrón recursivo hasta que los nodos de la hoja estén puros y termine con un árbol similar al siguiente en función de la división.
let learnedTree = Node(0,"A0", Node(2,"A2", Leaf(0), Leaf(1)), Node(1,"A1", Node(2,"A2", Leaf(0), Leaf(1)), Leaf(0)))
Esto es lo que "piratearon" hasta ahora, pero creo que podría estar muy lejos:
let rec createTree (listToSplit : list<list<float>>) index =
let leftSideSplit =
listToSplit |> List.choose (fun x -> if x.Item(index) = 1. then Some(x) else None)
let rightSideSplit =
listToSplit |> List.choose (fun x -> if x.Item(index) = 0. then Some(x) else None)
if leftSideSplit.Length > 0 then
let pureCheck = isListPure leftSideSplit
if pureCheck = 0 then
printfn "%s" "Pure left node class 0"
createTree leftSideSplit (index + 1)
else if pureCheck = 1 then
printfn "%s" "Pure left node class 1"
createTree leftSideSplit (index + 1)
else
printfn "%s - %A" "Recursing Left" leftSideSplit
createTree leftSideSplit (index + 1)
else printfn "%s" "Pure left node class 0"
¿Debería estar utilizando la coincidencia de patrones en su lugar? ¿Algún consejo / ideas / ayuda? ¡Gracias un montón!