Svar: Nej, det kan ju finnas fler klasser, även om det inte är fallet i den aktuella träningsmängden.
Svar: Predikatet decision_tree(Es,As,D,T) tar som indata en lista med exempel Es, en lista med attribut As och en defaultklass D och konstruerar ett beslutsträd T.
Elementen i Es antas vara representerade på följande sätt:
E = (c,[(A1,V1), ..., (An,Vn)]) där c är en klass och (Ai,Vi), 1<=i<=n, är ett par där Ai är ett attribut och Vi är ett värde.
Beslutsträdet T representeras på följande sätt:
T = class(c), där c är en klass, eller
T = (A, [(V1,T1), ..., (Vn,Tn)]) där A är ett attribut, V1, ..., Vn är de möjliga värdena på attributet A, och där T1, ..., Tn är beslutsträd.
T.ex. (gäster,[(inga,class(nej)),(några,class(ja)),(fullsatt,(väntetid[...]))]) representerar ett beslutsträd där roten med attributet gäster har ett subträd för varje värde på attributet, och där de två första subträden endast innehåller klasser medan det tredje har attributet väntetid i roten.
Svar: Här hittar du ett program som gör det.
Svar: T.ex. ?- classes([(pos,[(a1,1),(a2,2)]),(neg,[(a1,3),(a2,3)]),(pos,[(a1,3),(a2,2)])],C).
C = [(pos,2),(neg,1)]
och ?- Es = [(pos,[(a1,1),(a2,2)]),(neg,[(a1,3),(a2,3)]),(pos,[(a1,3),(a2,2)])],
best_attribute(Es,[a1,a2],A,AsRest,VEs).
skall binda A till ett av attributen (det mest informativa av a1 och a2,
antag att det är a2), AsRest blir en lista med attribut som inte har valts (dvs. [a1]),
och VEs blir en lista med lika många element som a2 har möjliga värden (låt säga
att a2 kan anta värdena 1,2 och 3), t.ex. [(1,[]),(2,[(pos,[(a1,1),(a2,2)]),(pos,[(a1,3),(a2,2)])]),(3,[(neg,[(a1,3),(a2,3)])])].
Ett anrop av classify/3 skulle kunna se ut på följande sätt:
?- classify([(a1,3),(a2,3)],(a2,[(1,class(pos)),(2,class(pos)),(3,class(neg))]),C).
C=neg
Svar: Ett sätt är att ladda in filen, t.ex. med ['Träningsexempel.pl'], och sedan samla upp exemplena i en lista med findall,
t.ex. med findall((Class,Attributes), example(Class,Attributes), Es).
För ytterligare detaljer se nästa fråga.
Svar: Det är absolut godkänt! Ett alternativt sätt är
helt enkelt att först ladda in den ena filen, bygga trädet, och
sedan ladda in den andra (SICStus kommer då att fråga om den
ursprungliga definitionen av example/2 skall ersättas, varpå man
kan svara 'y'), och sedan klassificera exemplena. Det vill säga,
den övergripande frågan kommer se ut på följande sätt:
?- ['Träningsexempel.pl'],
findall((Class,Attributes), example(Class,Attributes),TrainingExamples),
classes(TrainingExamples,[(DefaultClass,_)|_]),
findall(Attribute,attribute(Attribute,_),AllAttributes),
decision_tree(TrainingExamples,AllAttributes,DefaultClass,Tree),
['Testexempel.pl'],
findall((Class,Attributes), example(Class,Attributes),TestExamples),
test_classification(TestExamples,Tree).