⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 discr.cpp

📁 计算机人工智能方面的决策树方法 c4.5
💻 CPP
字号:
/*************************************************************************/
/*                                                                       */
/*      Evaluation of a test on a discrete valued attribute              */
/*      ---------------------------------------------------              */
/*                                                                       */
/*************************************************************************/


#include "buildex.h"
#include "extern.h"
extern FILE *fpScreen;


/*************************************************************************/
/*                                                                       */
/*  Set Info[] and Gain[] for discrete partition of items Fp to Lp       */
/*                                                                       */
/*************************************************************************/


void EvalDiscreteAtt(Attribute Att, ItemNo Fp, ItemNo Lp, ItemCount Items)
/*  ---------------  */ 
{ 
    ItemCount KnownItems;

    ComputeFrequencies(Att, Fp, Lp);

    KnownItems = Items - ValFreq[0];

    /*  Special case when no known values of the attribute  */

    if ( Items <= ValFreq[0] )
    {
	Verbosity(2)
	{
		fprintf(fpScreen,"\tAtt %s: no known values\n", AttName[Att]);
		printf("\tAtt %s: no known values\n", AttName[Att]);
	}

	Gain[Att] = -Epsilon;
	Info[Att] = 0.0;
	return;
    }

    Gain[Att] = ComputeGain(DiscrKnownBaseInfo(KnownItems, MaxAttVal[Att]),
			    UnknownRate[Att], MaxAttVal[Att], KnownItems);
    Info[Att] = TotalInfo(ValFreq, 0, MaxAttVal[Att]) / Items;

    Verbosity(2)
    {
	fprintf(fpScreen,"\tAtt %s", AttName[Att]);
	printf("\tAtt %s", AttName[Att]);
	Verbosity(3) PrintDistribution(Att, MaxAttVal[Att], true);
	fprintf(fpScreen,"\tinf %.3f, gain %.3f\n", Info[Att], Gain[Att]);
	printf("\tinf %.3f, gain %.3f\n", Info[Att], Gain[Att]);
    }
} 



/*************************************************************************/
/*                                                                       */
/*  Compute frequency tables Freq[][] and ValFreq[] for attribute        */
/*  Att from items Fp to Lp, and set the UnknownRate for Att             */
/*                                                                       */
/*************************************************************************/


void ComputeFrequencies(Attribute Att,ItemNo Fp,ItemNo Lp)
/*  ------------------  */
{
    Description Case; 
    ClassNo c;
    DiscrValue v;
    ItemNo p;

    ResetFreq(MaxAttVal[Att]);

    /*  Determine the frequency of each class amongst cases
	with each possible value for the given attribute  */

    ForEach(p, Fp, Lp)
    { 
	Case = Item[p];
	Freq[ DVal(Case,Att) ][ Class(Case) ] += Weight[p];
    } 

    /*  Determine the frequency of each possible value for the
	given attribute  */

    ForEach(v, 0, MaxAttVal[Att]) 
    { 
	ForEach(c, 0, MaxClass)
	{
	    ValFreq[v] += Freq[v][c];
	}
    }

    /*  Set the rate of unknown values of the attribute  */
 
    UnknownRate[Att] = ValFreq[0] / CountItems(Fp, Lp);
}



/*************************************************************************/
/*                                                                       */
/*  Return the base info for items with known values of a discrete       */
/*  attribute, using the frequency table Freq[][]                        */
/*                                                                       */
/*************************************************************************/


double DiscrKnownBaseInfo(ItemCount KnownItems,DiscrValue MaxVal)
/*    ------------------  */    
{
    ClassNo c;
    ItemCount ClassCount;
    double Sum=0;
    DiscrValue v;

    ForEach(c, 0, MaxClass)
    {
	ClassCount = 0;
	ForEach(v, 1, MaxVal)
	{
	    ClassCount += Freq[v][c];
	}
	Sum += ClassCount * Log(ClassCount);
    }

    return (KnownItems * Log(KnownItems) - Sum) / KnownItems;
}



/*************************************************************************/
/*                                                                       */
/*  Construct and return a node for a test on a discrete attribute       */
/*                                                                       */
/*************************************************************************/


void    DiscreteTest(Tree Node, Attribute Att)
/*  ----------  */
{
    ItemCount CountItems();

    Sprout(Node, MaxAttVal[Att]);

    Node->NodeType      = BrDiscr;
    Node->Tested        = Att;
    Node->Errors        = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -