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. MSDN地址,记录下来,以防以后使用

    MSDN在线官网:https://msdn.microsoft.com/zh-cn/default.aspx 以备学习时候使用.

  2. JS函数作用域及作用域链理解

    从事web开发工作,尤其主要是做服务器端开发的,难免会对客户端语言JavaScript一些概念有些似懂非懂的,甚至仅停留在实现功能的层面上,接下来的文章,是记录我对JavaScript的一些概念的理解 ...

  3. 在node.js中使用ejs的demo 第五篇

    先说明一下我的项目的目录解构: 本项目中渲染的时候都是通过在index.js页面里面,来使用index.ejs的,首先引用必须的模块: var express = require('express') ...

  4. js——事件

    焦点:使浏览器能够区分用户输入的对象,当一个元素有焦点的时候,那么他就可以接收用户的输入. 我们可以通过一些方式给元素设置焦点 1.点击 2.tab 3.js 不是所有元素都能够接收焦点的.能够响应用 ...

  5. 提取 ECharts 中的svg地图信息

    地图的需求还是蛮大的,全国都要自己画的话,还是需要投入比较大的人力. ECharts中有地图,那我们能不能把里面的地图文件提取出来呢,主要逻辑在map.js中. 看源代码发现,ECharts中地图信息 ...

  6. ThinkPHP中 按条件查询后列表显示

    最近在项目中遇到了需要根据下拉框的条件筛选出符合条件的数据,然后进行列表显示的问题. 在ThinkPHP中进行列表显示的传统过程:通过在后台控制器中查询出数据,然后通过$this->assign ...

  7. 【Windows 8 Store App】学习:目录

    原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093302.html 写在前面:我之前从事java开发,对MS的一整套东西还没入门哈,难 ...

  8. java实现二维码生成的几个方法

    1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/ ...

  9. poj2871

    #include <stdio.h> #include <stdlib.h> //法一 int main() { ]; ,tmp; ) { scanf("%lf&qu ...

  10. UberX及以上级别车奖励政策(优步北京第一组)

    优步北京第一组: 定义为2015年6月1日凌晨前(不含6月1日)激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机( ...