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

📄 userint.c

📁 c4.5的源码决策树最全面最经典的版本
💻 C
字号:
/*************************************************************************//*								 	 *//*	User interface for consulting trees and rulesets	 	 *//*	------------------------------------------------	 	 *//*								 	 *//*************************************************************************/#include "defns.i"#include "types.i"#include "extern.i"typedef	struct	ValRange	*RangeDescRec;struct	ValRange	{	    Boolean		Known, Asked;	    float		LowerBound, UpperBound, *Probability;	};extern	RangeDescRec		RangeDesc;#define Fuzz 0.01/*************************************************************************//*									 *//*	Ask for the value of attribute Att if necessary			 *//*									 *//*************************************************************************/    CheckValue(Att, T)/*  ----------  */    Attribute Att;    Tree T;{    if ( RangeDesc[Att].Asked ) return;    printf("%s", AttName[Att]);    if ( RangeDesc[Att].Known )    {	printf(" [ ");	PrintRange(Att);	printf(" ]");    }    printf(": ");    ReadRange(Att, T);} /*************************************************************************//*									 *//*	Print the range of values for attribute Att			 *//*									 *//*************************************************************************/    PrintRange(Att)/*  -----------  */    Attribute Att;{    DiscrValue dv;    Boolean First=true;    float p;    if ( MaxAttVal[Att] )  /*  discrete attribute  */    {	ForEach(dv, 1, MaxAttVal[Att] )	{	    if ( (p = RangeDesc[Att].Probability[dv]) > Fuzz )	    {		if ( ! First )		{		    printf(", ");		}		First = false;		printf("%s", AttValName[Att][dv]);		if ( p < 1-Fuzz )		{		    printf(": %.2f", p);		}	    }	}    }    else  /*  continuous attribute  */    {	printf("%g", RangeDesc[Att].LowerBound);	if ( RangeDesc[Att].UpperBound > RangeDesc[Att].LowerBound + Fuzz )	{	    printf(" - %g", RangeDesc[Att].UpperBound);	}    }}extern	char		Delimiter;#define	SkipSpace	while ( (c = getchar()) == ' ' || c == '\t' )/*************************************************************************//*									 *//*	Read a range of values for attribute Att or <cr>		 *//*									 *//*************************************************************************/    ReadRange(Att, T)/*  ----------  */    Attribute Att;    Tree T;{    char c;    RangeDesc[Att].Asked=true;    SkipSpace;    if ( c == '\n' )    {	return;    }    if ( c == '?' )    {	if ( (c = getchar()) == 't' )	{	    if ( T ) PrintTree(T);	    SkipLine(c);	    RangeDesc[Att].Asked = false;	    CheckValue(Att, T);	}	else	{	    RangeDesc[Att].Known = false;	    SkipLine(c);	}	return;    }    ungetc(c, stdin);    RangeDesc[Att].Known = true;    if ( MaxAttVal[Att] )    {	ReadDiscr(Att, T);    }    else    {	ReadContin(Att, T);    }}/*************************************************************************//*									 *//*	Read a discrete attribute value or range			 *//*									 *//*************************************************************************/    ReadDiscr(Att, T)/*  ---------  */    Attribute Att;    Tree T;{    char Name[500];    Boolean ReadName();    DiscrValue dv, PNo;    float P, PSum;    ForEach(dv, 1, MaxAttVal[Att])    {	RangeDesc[Att].Probability[dv] = 0.0;    }    do    {	ReadName(stdin, Name);	dv = Which(Name, AttValName[Att], 1, MaxAttVal[Att]);	if ( ! dv )	{	    printf("\tPermissible values are %s", AttValName[Att][1]);	    ForEach(dv, 2, MaxAttVal[Att])	    {		printf(", %s", AttValName[Att][dv]);	    }	    printf("\n");	    SkipLine(Delimiter);	    Retry(Att, T);	    return;	}	if ( Delimiter == ':' )	{	    ReadName(stdin, Name);	    sscanf(Name, "%f", &P);	/* get probability */	}	else	{	    P = 1.0;		/*  only one attribute value  */	}	RangeDesc[Att].Probability[dv] = P;    }    while ( Delimiter == ',' );    /*  Check that sum of probabilities is not > 1  */    PNo = MaxAttVal[Att];    PSum = 1.0;    ForEach(dv, 1, MaxAttVal[Att])    {	if ( RangeDesc[Att].Probability[dv] > Fuzz )	{	    PSum -= RangeDesc[Att].Probability[dv];	    PNo--;	}    }    if ( PSum < 0 || ! PNo && PSum > Fuzz )    {	printf("Probability values must sum to 1\n");	SkipLine(Delimiter);	Retry(Att, T);	return;    }    /*  Distribute the remaining probability equally among	the unspecified attribute values  */    PSum /= PNo;    ForEach(dv, 1, MaxAttVal[Att])    {	if ( RangeDesc[Att].Probability[dv] < Fuzz )	{	    RangeDesc[Att].Probability[dv] = PSum;	}    }}/*************************************************************************//*									 *//*	Read a continuous attribute value or range			 *//*									 *//*************************************************************************/    ReadContin(Att, T)/*  ----------  */    Attribute Att;    Tree T;{    char c;    scanf("%f", &RangeDesc[Att].LowerBound);    SkipSpace;    if ( c == '-'  )    {	scanf("%f", &RangeDesc[Att].UpperBound);	SkipSpace;    }    else    {	RangeDesc[Att].UpperBound = RangeDesc[Att].LowerBound;    }    if ( c != '\n' )    {	printf("Must be a continuous value or range\n");	SkipLine(c);	Retry(Att, T);    }}/*************************************************************************//*									 *//*	Try again to obtain a value for attribute Att			 *//*									 *//*************************************************************************/    Retry(Att, T)/*  -----  */    Attribute Att;    Tree T;{    RangeDesc[Att].Asked = false;    RangeDesc[Att].Known = false;    CheckValue(Att, T);}/*************************************************************************//*									 *//*	Skip to the end of the line of input				 *//*									 *//*************************************************************************/    SkipLine(c)/*  --------  */    char c;{    while ( c != '\n' ) c = getchar();}/*************************************************************************//*									 *//*		Clear the range description				 *//*									 *//*************************************************************************/    Clear()/*  -----  */{    Attribute Att;    ForEach(Att, 0, MaxAtt)    {	RangeDesc[Att].Known = false;    }}

⌨️ 快捷键说明

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