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

📄 classify.c

📁 一个简洁好用的SVM代码
💻 C
字号:
/*************************************************************************/

/*                                                              	 */

/*  Determine the class of a case description from a decision tree	 */

/*  --------------------------------------------------------------	 */

/*                                                              	 */

/*************************************************************************/





#include "defns.i"

#include "types.i"

#include "extern.i"



float	*ClassSum=Nil;		/* ClassSum[c] = total weight of class c */







/*************************************************************************/

/*                                                              	 */

/*  Categorize a case description using the given decision tree		 */

/*                                                              	 */

/*************************************************************************/





ClassNo Category(CaseDesc, DecisionTree) 

/*       --------  */

    Description CaseDesc; 

    Tree DecisionTree; 

{ 

    ClassNo c, BestClass;



    if ( ! ClassSum )

    {

	ClassSum = (float *) malloc((MaxClass+1) * sizeof(float));

    }



    ForEach(c, 0, MaxClass)

    {

	ClassSum[c] = 0;

    }



    Classify(CaseDesc, DecisionTree, 1.0);



    BestClass = 0;

    ForEach(c, 0, MaxClass)

    {

	Verbosity(5) printf("class %s weight %.2f\n", ClassName[c], ClassSum[c]);



	if ( ClassSum[c] > ClassSum[BestClass] ) BestClass = c;

    }



    return BestClass;

}







/*************************************************************************/

/*                                                              	 */

/*  Classify a case description using the given subtree by adjusting	 */

/*  the value ClassSum for each class					 */

/*                                                              	 */

/*************************************************************************/





    Classify(CaseDesc, T, Weight)

/*  --------  */

    Description CaseDesc; 

    Tree T;

    float Weight;

{

    DiscrValue v, dv;

    float Cv;

    Attribute a;

    ClassNo c;



    switch ( T->NodeType )

    {

        case 0:  /* leaf */



	    if ( T->Items > 0 )

	    {

		/*  Update from ALL classes  */



		ForEach(c, 0, MaxClass)

		{

		    if ( T->ClassDist[c] )

		    {

			ClassSum[c] += Weight * T->ClassDist[c] / T->Items;

		    }

		}

	    }

	    else

	    {

		ClassSum[T->Leaf] += Weight;

	    }



	    return;



	case BrDiscr:  /* test of discrete attribute */



	    a = T->Tested;

	    v = DVal(CaseDesc, a);



	    if ( v && v <= T->Forks )	/*  Make sure not new discrete value  */

	    {

		Classify(CaseDesc, T->Branch[v], Weight);

	    }

	    else

	    {

		ForEach(v, 1, T->Forks)

		{

		    Classify(CaseDesc, T->Branch[v], 

			     (Weight * T->Branch[v]->Items) / T->Items);

		}

	    }



	    return;



	case ThreshContin:  /* test of continuous attribute */



	    a = T->Tested;

	    Cv = CVal(CaseDesc, a);



	    if ( Cv == Unknown )

	    {

		ForEach(v, 1, 2)

		{

		    Classify(CaseDesc, T->Branch[v], 

			     (Weight * T->Branch[v]->Items) / T->Items);

		}

	    }

	    else

	    {

		v = ( Cv <= T->Cut ? 1 : 2 );

		Classify(CaseDesc, T->Branch[v], Weight);

	    }



	    return;



	case BrSubset:  /* subset test on discrete attribute  */



	    a = T->Tested;

	    dv = DVal(CaseDesc, a);



	    if ( dv )

	    {

		ForEach(v, 1, T->Forks)

		{

		    if ( In(dv, T->Subset[v]) )

		    {

			Classify(CaseDesc, T->Branch[v], Weight);



			return;

		    }

		}

	    }



	    /*  Value unknown or not found in any of the subsets  */



	    ForEach(v, 1, T->Forks)

	    {

		Classify(CaseDesc, T->Branch[v], 

		         (Weight * T->Branch[v]->Items) / T->Items);

	    }



	    return;

    } 

}

⌨️ 快捷键说明

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