Po pierwsze, aby zapewnić pełne ujawnienie, chcę podkreślić, że jest to związane z zadaniami domowymi w klasie Machine Learning. To pytanie nie jest zadaniem domowym, a zamiast tego jest czymś, co muszę wymyślić, aby ukończyć większy problem z tworzeniem algorytmu drzewa decyzyjnego ID3.Potrzebna pomoc Tworzenie drzewa binarnego z tabelą prawdy
muszę wygenerować drzewo podobny do poniższego gdy dana tabela prawdy
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 jest typu BinaryTree który mam zdefiniowane następująco:
type BinaryTree =
| Leaf of int
| Node of int * string * BinaryTree * BinaryTree
algorytmy ID3 uwzględniać różne równania, aby określić, gdzie podzielić drzewo, i mam wszystko to zorientowali się, mam problem z utworzeniem nauczył drzewa z mojej tabeli prawdy. Na przykład, jeśli mam następującą tabelę
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
I podjąć decyzję o podziale na atrybutu A1 chciałbym skończyć z poniższym:
(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
Następnie chciałbym podzielić się lewym skrzydłem i podzielić prawą stronę i kontynuuj rekursywny wzorzec, aż węzły liści będą czyste, a ja zakończę drzewem podobnym do następującego na podstawie podziału.
let learnedTree = Node(0,"A0", Node(2,"A2", Leaf(0), Leaf(1)), Node(1,"A1", Node(2,"A2", Leaf(0), Leaf(1)), Leaf(0)))
Oto co ja niby „hacked” razem tak daleko, ale myślę, że mogę być daleko:
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"
powinienem używać wzór pasujący zamiast? Wszelkie wskazówki/pomysły/pomoc? Wielkie dzięki!