📄 genrules.c
字号:
/*************************************************************************/
/* */
/* Generate all rulesets from the decision trees */
/* --------------------------------------------- */
/* */
/*************************************************************************/
#include "defns.i"
#include "types.i"
#include "extern.i"
#include "rulex.i"
/*************************************************************************/
/* */
/* For each tree, form a set of rules and process them, then form a */
/* composite set of rules from all of these sets. */
/* If there is only one tree, then no composite set is formed. */
/* */
/* Rulesets are stored in PRSet[0] to PRSet[TRIALS], where */
/* PRSet[TRIALS] contains the composite ruleset. */
/* */
/* On completion, the current ruleset is the composite ruleset (if one */
/* has been made), otherwise the ruleset from the single tree. */
/* */
/*************************************************************************/
GenerateRules()
/* ------------- */
{
Tree DecisionTree, GetTree();
short t=0, RuleSetSpace=0, r;
/* Find bits to encode attributes and branches */
FindTestCodes();
/* Now process each decision tree */
while ( DecisionTree = GetTree(".unpruned") )
{
printf("\n------------------\n");
printf("Processing tree %d\n", t);
/* Form a set of rules from the next tree */
FormRules(DecisionTree);
/* Process the set of rules for this trial */
ConstructRuleset();
printf("\nFinal rules from tree %d:\n", t);
PrintIndexedRules();
/* Make sure there is enough room for the new ruleset */
if ( t + 1 >= RuleSetSpace )
{
RuleSetSpace += 10;
if ( RuleSetSpace > 10 )
{
PRSet = (RuleSet *) realloc(PRSet, RuleSetSpace * sizeof(RuleSet));
}
else
{
PRSet = (RuleSet *) malloc(RuleSetSpace * sizeof(RuleSet));
}
}
PRSet[t].SNRules = NRules;
PRSet[t].SRule = Rule;
PRSet[t].SRuleIndex = RuleIndex;
PRSet[t].SDefaultClass = DefaultClass;
++t;
}
if ( ! t )
{
printf("\nERROR: can't find any decision trees\n");
exit(1);
}
TRIALS = t;
/* If there is more than one tree in the trees file,
make a composite ruleset of the rules from all trees */
if ( TRIALS > 1 )
{
CompositeRuleset();
}
}
/*************************************************************************/
/* */
/* Determine code lengths for attributes and branches */
/* */
/*************************************************************************/
FindTestCodes()
/* ------------- */
{
Attribute Att;
DiscrValue v, V;
ItemNo i, *ValFreq;
int PossibleCuts;
float Sum, SumBranches=0, p;
void SwapUnweighted();
BranchBits = (float *) malloc((MaxAtt+1) * sizeof(float));
ForEach(Att, 0, MaxAtt)
{
if ( (V = MaxAttVal[Att]) )
{
ValFreq = (ItemNo *) calloc(V+1, sizeof(ItemNo));
ForEach(i, 0, MaxItem)
{
ValFreq[DVal(Item[i],Att)]++;
}
Sum = 0;
ForEach(v, 1, V)
{
if ( ValFreq[v] )
{
Sum += (ValFreq[v] / (MaxItem+1.0)) *
(LogItemNo[MaxItem+1] - LogItemNo[ValFreq[v]]);
}
}
free(ValFreq);
BranchBits[Att] = Sum;
}
else
{
Quicksort(0, MaxItem, Att, SwapUnweighted);
PossibleCuts = 1;
ForEach(i, 1, MaxItem)
{
if ( CVal(Item[i],Att) > CVal(Item[i-1],Att) )
{
PossibleCuts++;
}
}
BranchBits[Att] = PossibleCuts > 1 ?
1 + LogItemNo[PossibleCuts] / 2 : 0 ;
}
SumBranches += BranchBits[Att];
}
AttTestBits = 0;
ForEach(Att, 0, MaxAtt)
{
if ( (p = BranchBits[Att] / SumBranches) > 0 )
{
AttTestBits -= p * log(p) / log(2.0);
}
}
}
/*************************************************************************/
/* */
/* Exchange items at a and b. Note: unlike the similar routine in */
/* buildtree, this does not assume that items have a Weight to be */
/* swapped as well! */
/* */
/*************************************************************************/
void SwapUnweighted(a, b)
/* -------------- */
ItemNo a, b;
{
Description Hold;
Hold = Item[a];
Item[a] = Item[b];
Item[b] = Hold;
}
/*************************************************************************/
/* */
/* Form composite ruleset for all trials */
/* */
/*************************************************************************/
CompositeRuleset()
/* ---------------- */
{
RuleNo r;
short t, ri;
Boolean NewRule();
InitialiseRules();
/* Lump together all the rules from each ruleset */
ForEach(t, 0, TRIALS-1)
{
ForEach(ri, 1, PRSet[t].SNRules)
{
r = PRSet[t].SRuleIndex[ri];
NewRule(PRSet[t].SRule[r].Lhs, PRSet[t].SRule[r].Size,
PRSet[t].SRule[r].Rhs, PRSet[t].SRule[r].Error);
}
}
/* ... and select a subset in the usual way */
ConstructRuleset();
printf("\nComposite ruleset:\n");
PrintIndexedRules();
PRSet[TRIALS].SNRules = NRules;
PRSet[TRIALS].SRule = Rule;
PRSet[TRIALS].SRuleIndex = RuleIndex;
PRSet[TRIALS].SDefaultClass = DefaultClass;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -