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

📄 prune.c

📁 source codes for ltr
💻 C
字号:
/*********************************************************************//*        LINEAR TREE for Supervised Learning                        *//*        Versao 1.0 (10/12/1997)                                    *//*        Developed by: Joao Gama                                    *//*                LIACC - Uni.do Porto                               *//*                jgama@ncc.up.pt                                    *//*-------------------------------------------------------------------*//*   FILE:prune.c                                                    */  /*********************************************************************/#include <stdio.h>#include <stdlib.h>#include <math.h>#include "Ci_instances.h"#include "tree.h"#include "externs.i"static double PruneTree(DomainInfo *domain, Tree *tree, int (Func)(DomainInfo *, void *, double **), double *nr_erros);static double AddErrs1(double N, double e);static double AddErrs(double N, double e);static float Val[] = {  0,  0.001, 0.005, 0.01, 0.05, 0.10, 0.20, 0.40, 1.00};static float Dev[] = {100,  3.09,  2.58,  2.33, 1.65, 1.28, 0.84, 0.25, 0.00};TreeInfo *Prune_Tree\(DomainInfo *domain, Tree *tree, int (Func)(DomainInfo *, void *, double **), double *erros){  int depth = 0;  double nr_erros=0;  TreeInfo *treeinfo;  PruneTree(domain, tree, Func, &nr_erros);  treeinfo = Recompute_Nodes(tree, &depth);  ERRORS(treeinfo) = nr_erros;  DEPTH(treeinfo) = depth;  return treeinfo;}static double PruneTree\(DomainInfo *domain, Tree *tree, int (Func)(DomainInfo *, void *, double **), double *nr_erros){  register int i, classe;  double pessi_error = 0.0, estimated_error = 0.0, *distrib;  double node_errors, leaf_errors = 0.0, sum_leaf_errors = 0.0;  classe = Func(domain, tree->data, &distrib);  node_errors = distrib[0] - distrib[classe];  if (distrib[0])    estimated_error = node_errors + AddErrs1(distrib[0], node_errors);  else    estimated_error = 0.5;    switch(tree->tipo) {  case leaf:    *nr_erros = node_errors;    return estimated_error;    break;  case split_discrete:    sum_leaf_errors = 0.0;    for(i = 1; i <= NR_DESCENDENTS(tree); i++) {      pessi_error += PruneTree(domain, DESCENDENT(tree, i), Func, &leaf_errors);      sum_leaf_errors += leaf_errors;    }    break;  case split_continuous:  case split_linear:    pessi_error += PruneTree(domain, DESCENDENT(tree, 1), Func, &leaf_errors);    sum_leaf_errors = leaf_errors;    pessi_error += PruneTree(domain, DESCENDENT(tree, 2), Func, &leaf_errors);    sum_leaf_errors += leaf_errors;    break;  }  *nr_erros = sum_leaf_errors;  if ((estimated_error <= pessi_error) || (node_errors <= sum_leaf_errors)) {    tree->tipo = leaf;    DESCENDENTS(tree) = NULL;    NR_DESCENDENTS(tree) = 0;    *nr_erros = node_errors;    return estimated_error;  }  return pessi_error;}static double AddErrs1(double N, double e){  double estimate = 0.0;  estimate = AddErrs(N, e);  if (e > N / 2.0)    estimate += AddErrs(N, N / 2.0);  return estimate;}/* ==============================================   Based on C4.5 Error estimator Routine   ===============================================*/static double AddErrs(double N, double e){  register int i;  static double Coeff=0;  double Val0, Pr;    if ( ! Coeff ) {    i = 0;    while ( CF > Val[i] ) i++;    Coeff = Dev[i-1] +      (Dev[i] - Dev[i-1]) * (CF - Val[i-1]) /(Val[i] - Val[i-1]);    Coeff = Coeff * Coeff;  }    if ( e < 1E-6 )    {    return N * (1 - exp(log(CF) / N));  }  else    if ( e < 0.9999 )  {      Val0 = N * (1 - exp(log(CF) / N));      return Val0 + e * (AddErrs(N, 1.0) - Val0);    }    else      if ( e + 0.5 >= N )          return 0.67 * (N - e);      else    {        Pr = (e + 0.5 + Coeff/2              + sqrt(Coeff * ((e + 0.5) * (1 - (e + 0.5)/N) + Coeff/4)) )          / (N + Coeff);        return (N * Pr - e);      }}

⌨️ 快捷键说明

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