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 pregunta de la tarea y, en cambio, es algo que tengo que resolver para completar el problema más grande de la creación de un Algoritmo del Árbol de Decisión ID3.Ayuda necesaria Crear un árbol binario con la tabla de verdad
necesito para generar el árbol similar al siguiente cuando se le 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)))
learnedTree es de BinaryTree tipo que he definido como sigue:
type BinaryTree =
| Leaf of int
| Node of int * string * BinaryTree * BinaryTree
algoritmos ID3 tienen en cuenta varias ecuaciones para determinar dónde dividir el árbol, y tengo todo eso 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 dividir el atributo A1 iba a terminar 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
continuación, me gustaría dividir el lado izquierdo y dividir el lado derecho y continúe el patrón recursivo hasta que los nodos de las hojas sean puros y termine con un árbol similar al siguiente basado en 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 he especie de "hackeado" juntos hasta ahora, pero creo que podría ser 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"
¿Debo utilizar coincidencia de patrones en su lugar? ¿Algún consejo/ideas/ayuda? ¡Gracias un montón!