ID3分类算法的编码实现

 <?php
/*
*决策树ID3算法(分类算法的实现)
*/ /* *求信息增益Grain(S1,S2) */ //--------------------------------------------------------------------
function Grain($train,$attriname,$flagsyes,$flagsno)
{
$attributename = array(NULL);//用来存放属性$attriname不同的属性值
array_splice($attributename,0,1); for($i=1;$i<count($train[0]);$i++)
{
if($attriname==$train[0][$i])
{
$num = $i;//记录$train第几个属性是$attriname
for($j=1;$j<count($train);$j++)
{
$flags = true;//用于判断将要存放的属性值是否已经存在
for($k=0;$k<count($attributename);$k++)
{
if($attributename[$k]==$train[$j][$i])//即将存入的属性值已经存在
{
$flags = false;
break;
}
}
if($flags)//新的属性值不存在,$attributename存入新的属性值
{
array_push($attributename,$train[$j][$i]);
}
}
break;
}
} for($i=0;$i<count($attributename);$i++)
{
$count[$i][0] = $attributename[$i];//属性名称
$count[$i][1] = 0;//用来统计$attributename[$i] $flagsyes的个数
$count[$i][2] = 0;//用来统计$attributename[$i] $flagsno的个数
} for($i=1;$i<count($train);$i++)
{
for($j=0;$j<count($attributename);$j++)
{
//print_r($train[$i][count($train[$i])-1]."<br>");
if(($train[$i][$num]==$attributename[$j])&&($train[$i][count($train[$i])-1]==$flagsyes))
{
$count[$j][1]++;
}else if(($train[$i][$num]==$attributename[$j])&&($train[$i][count($train[$i])-1]==$flagsno)){
$count[$j][2]++;
}
}
} $num_yes = 0;//类别为$flagsyes的个数
$num_no = 0;//类别为$flagsno的个数
for($i=1;$i<count($train);$i++)
{
if($train[$i][count($train[$i])-1]==$flagsyes)
{
$num_yes++;
}else {
$num_no++;
}
} //分类所需要的 信息量
$I=0;
$s[0] = $num_yes;
$s[1] = $num_no ;
for($i=0;$i<2;$i++)
{
if($s[$i]!=0)$I += -$s[$i] / ($num_yes+$num_no) * log($s[$i]/($num_yes+$num_no)) / log(2);
} $EA = 0 ;
for($i=0;$i<count($count);$i++)
{
$si = 0;
for($j=1;$j<count($count[$i]);$j++)
{
if($count[$i][$j]!=0)$si += -$count[$i][$j] / ($count[$i][1]+$count[$i][2]) * log($count[$i][$j]/($count[$i][1]+$count[$i][2])) / log(2);
}
$EA += ($count[$i][1]+$count[$i][2])/($num_yes+$num_no) * $si;
} //信息增益Gain
$Gain = $I - $EA;
return $Gain;
}
//-------------------------------------------------------------------- /* *求几个属性信息增益最大的那一个 */ //--------------------------------------------------------------------
function Attributelist($train,$flagsyes,$flagsno)
{
$array_attribute_grain = array(array(NULL,NULL));//存放属性值以及属性值对应的信息增益
for($i=1;$i<count($train[0])-1;$i++)
{
$array_attribute_grain[$i-1][0] = $train[0][$i];
$array_attribute_grain[$i-1][1] = Grain($train,$train[0][$i],$flagsyes,$flagsno);
} for($i=1;$i<count($array_attribute_grain);$i++)
{
if($array_attribute_grain[$i][1]>$array_attribute_grain[0][1])
{
$array_attribute_grain[0][0] = $array_attribute_grain[$i][0];
$array_attribute_grain[0][1] = $array_attribute_grain[$i][1];
} }
/*
echo "<pre>";
print_r($array_attribute_grain[0]);
echo "<pre>";
*/
return $array_attribute_grain[0];
}
//-------------------------------------------------------------------- /* *构建ID3决策树(数组存储) */ //--------------------------------------------------------------------
function DecisionTree($train,$flagsyes,$flagsno,&$array_tree)
{
$flags = true;
/*
*if所有样本均为同一类别C,返回N作为一个椰子结点并标志为C类别
*/
$num_yes = 0;//用于统计同一$flagsyes类别的数目
$num_no = 0;//用于统计同一$flagsno类别的数目
for($i=1;$i<count($train);$i++)
{
if($train[$i][count($train[$i])-1]==$flagsyes) $num_yes++;
else if($train[$i][count($train[$i])-1]==$flagsno) $num_no++;
} if($num_yes==(count($train)-1))//所有样本均为同一类别
{
array_push($array_tree,array($flagsyes));
$count++;
$flags = false;
}else if($num_no==(count($train)-1)){
array_push($array_tree,array($flagsno));
$count++;
$flags = false;
} /* *else if attribute /为空,则返回n作为一个叶子节点,并标记为该节点所含样本中类别最多的类别 */
if($flags)
{
$num_attribute = count($train)-2;
if($num_attribute==0)
{
if($num_yes>$num_no)
{
array_push($array_tree,array($flagsyes));
$count++;
$flags = false;
}else {
array_push($array_tree,array($flagsno));
$count++;
$flags = false;
} }
}
/* *从样本中选择分类能力最好的的属性 */
if($flags)
{
$attribute = Attributelist($train,$flagsyes,$flagsno); $attribute_name = array(NULL);
array_splice($attribute_name,0,1);
for($i=1;$i<count($train[0])-1;$i++)
{
if($train[0][$i]==$attribute[0])
{
$num = $i;
break;
}
}
for($i=1;$i<count($train);$i++)
{
$flags2 = true;
for($j=0;$j<count($attribute_name);$j++)
{
if($train[$i][$num]==$attribute_name[$j])
{
$flags2 = false;
break;
}
}
if($flags2)array_push($attribute_name,$train[$i][$num]);
}
//print_r($attribute_name);
$array_new = array(NULL);
array_splice($array_new,0,1);
for($i=0;$i<count($attribute_name);$i++)
{
$arraybranch = array(array());
array_splice($arraybranch,0,1);
$arraytemp = array(NULL);
array_splice($arraytemp,0,1);
array_push($arraybranch,$train[0]);
for($j=1;$j<count($train);$j++)
{
if($train[$j][$num]==$attribute_name[$i])
{
array_push($arraybranch,$train[$j]);
}
}
for($j=0;$j<count($arraybranch);$j++)
{
array_splice($arraybranch[$j],$num,1);
}
array_push($array_new,$arraybranch);
$num_branch_yes = 0;
$num_branch_no =0;
for($j=1;$j<count($arraybranch);$j++)
{
if($arraybranch[$j][count($arraybranch[$j])-1]==$flagsyes) $num_branch_yes++;
else $num_branch_no++;
}
if($num_branch_yes==count($arraybranch)-1)array_push($array_tree,array($attribute[0],$attribute_name[$i],$flagsyes));
else if($num_branch_no==count($arraybranch)-1)array_push($array_tree,array($attribute[0],$attribute_name[$i],$flagsno));
else {
$temp = Attributelist($arraybranch,$flagsyes,$flagsno);
array_push($array_tree,array($attribute[0],$attribute_name[$i],$temp[0]));
DecisionTree($arraybranch,$flagsyes,$flagsno,$array_tree,$count);
} }
}
/*
echo "<pre>";
print_r($array_tree);
echo "<pre>";
//print_r("<br>".$count);
*/
return $array_tree; }
//-------------------------------------------------------------------- /* *判断一个测试样本的类别 */
//--------------------------------------------------------------------
function ID3_Judge($test,$co,$decisiontree,$flagsyes,$flagsno)
{
//找寻根节点
$boot = $decisiontree[0][0];
for($i=1;$i<count($test[0])-1;$i++)
{
if($boot==$test[0][$i])
{
$num = $i;
break;
}
}
for($i=0;$i<count($decisiontree);$i++)
{
if(($decisiontree[$i][0]==$boot)&&($decisiontree[$i][1]==$test[$co][$num]))
{
if($decisiontree[$i][2]==$flagsyes)
{
$result = $flagsyes;
}else if($decisiontree[$i][2]==$flagsno){
$result = $flagsno;
}else{
$attributename = $decisiontree[$i][2];
$mid = $i;
}
}
}
while($attributename!=NULL)
{
$boot = $attributename;
for($i=1;$i<count($test[0])-1;$i++)
{
if($boot==$test[0][$i])
{
$num = $i;
break;
}
} for($i=$mid;$i<count($decisiontree);$i++)
{
if(($decisiontree[$i][0]==$boot)&&($decisiontree[$i][1]==$test[$co][$num]))
{
if($decisiontree[$i][2]==$flagsyes)
{
$attributename = NULL;
$result = $flagsyes;
}else if($decisiontree[$i][2]==$flagsno){
$attributename = NULL;
$result = $flagsno;
}else{
$attributename = $decisiontree[$i][2];
$mid = $i;
}
}
}
}
return $result;
}
//-------------------------------------------------------------------- /*
*把.txt中的内容读到数组中保存
*$filename:文件名称
*/ //--------------------------------------------------------------------
function gerFileContent($filename)
{
$array = array(NULL);
$content = file_get_contents($filename);
$result = explode("\r\n",$content); for($j=0;$j<count($result);$j++)
{
$con = explode(" ",$result[$j]);
array_push($array,$con);
}
array_splice($array,0,1);
return $array;
}
//--------------------------------------------------------------------
$train = gerFileContent("train.txt");
$test = gerFileContent("test.txt"); $array_tree = array(array(NULL,NULL,NULL));
array_splice($array_tree,0,1);
$decisiontree = DecisionTree($train,Y,N,$array_tree); for($i=1;$i<count($test);$i++)
{
$test[$i][count($test[0])-1] = ID3_Judge($test,$i,$decisiontree,Y,N);
} /* *将数组中的内容读到.txt中 */
//--------------------------------------------------------------------
$fp= fopen('result.txt','wb');
for($i=0;$i<count($test);$i++)
{
$temp = NULL;
for($j=0;$j<count($test[$i]);$j++)
{
$temp = $test[$i][$j]."\t";
fwrite($fp,$temp);
}
fwrite($fp,"\r\n");
}
fclose($fp);
//-------------------------------------------------------------------- /*
*打印输出决策树
*/
//--------------------------------------------------------------------
echo "<pre>";
print_r($decisiontree);
echo "<pre>";
//-------------------------------------------------------------------- /*
*打印输出
*/
//--------------------------------------------------------------------
echo "<pre>";
print_r($test);
echo "</pre>";
//--------------------------------------------------------------------
?>

决策树ID3算法[分类算法]的更多相关文章

  1. Naive Bayes(朴素贝叶斯算法)[分类算法]

    Naïve Bayes(朴素贝叶斯)分类算法的实现 (1) 简介: (2)   算法描述: (3) <?php /* *Naive Bayes朴素贝叶斯算法(分类算法的实现) */ /* *把. ...

  2. KNN算法[分类算法]

    kNN(k-近邻)分类算法的实现 (1) 简介: (2)算法描述: (3) <?php /* *KNN K-近邻方法(分类算法的实现) */ /* *把.txt中的内容读到数组中保存,$file ...

  3. 数据结构与算法---排序算法(Sort Algorithm)

    排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进 ...

  4. 决策树--ID3 算法(一)

    Contents      1. 决策树的基本认识      2. ID3算法介绍      3. 信息熵与信息增益      4. ID3算法的C++实现 1. 决策树的基本认识    决策树是一种 ...

  5. (ZT)算法杂货铺——分类算法之决策树(Decision tree)

    https://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html 3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分 ...

  6. 决策树ID3算法--python实现

    参考: 统计学习方法>第五章决策树]   http://pan.baidu.com/s/1hrTscza 决策树的python实现     有完整程序     决策树(ID3.C4.5.CART ...

  7. 用Python开始机器学习(2:决策树分类算法)

    http://blog.csdn.net/lsldd/article/details/41223147 从这一章开始进入正式的算法学习. 首先我们学习经典而有效的分类算法:决策树分类算法. 1.决策树 ...

  8. python 之 决策树分类算法

    发现帮助新手入门机器学习的一篇好文,首先感谢博主!:用Python开始机器学习(2:决策树分类算法) J. Ross Quinlan在1975提出将信息熵的概念引入决策树的构建,这就是鼎鼎大名的ID3 ...

  9. SparkMLlib分类算法之决策树学习

    SparkMLlib分类算法之决策树学习 (一) 决策树的基本概念 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风 ...

随机推荐

  1. iOS退出键盘的两种方式

    1,可以让叫出键盘的那个控件,退出第一响应者; 例如:textField叫出的键盘,那么就可以调用textField.resignFirstResponder,达到谁叫出的键盘谁退回去 2,可以让叫出 ...

  2. javascript原型链继承

    一.关于javascript原型的基本概念: prototype属性:每个函数都一个prototype属性,这个属性指向函数的原型对象.原型对象主要用于共享实例中所包含的的属性和方法. constru ...

  3. EC读书笔记系列之15:条款32、33、34

    条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个deriv ...

  4. JS数组操作常用方法

    toString():把数组转换成一个字符串 toLocaleString():把数组转换成一个字符串 join():把数组转换成一个用符号连接的字符串 shift():将数组头部的一个元素移出 un ...

  5. php数组分页类

    <?php class ArrayPage{ public $totalPage;//全部页数 public $lists;//每页显示数目 public $arr = array();//分页 ...

  6. warning: control reaches end of non-void function

    用gcc编译一个程序的时候出现这样的警告: warning: control reaches end of non-void function 它的意思是:控制到达非void函数的结尾.就是说你的一些 ...

  7. 【转】IOS开发小技巧

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  8. Oracle EBS-SQL (SYS-11):查询系统已打的PATCH.sql

    select a.patch_name,         b.DRIVER_FILE_NAME,         c.language,         b.creation_datefrom app ...

  9. 限制转交订单-采购直接批准PO

    应用 Oracle   Purchasing 层 Level Function 函数名 Funcgtion Name CUXPOXPOEPO 表单名 Form Name POXPOEPO 说明 Des ...

  10. uestc 10 In Galgame We Trust

    题意:求最长的合法括号序列 解:栈+分类讨论 now表示已经算出的序列,且此序列与现在扫描的序列可能能够连接,tmp表示现在扫描到的序列长度 左括号入栈 右括号:1.栈空时:统计当前总长 并且将栈,n ...