1.id3算法介绍

ID3算法是一种贪心算法,用来构造决策树。ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例。

2.优点

* ID3算法避免了搜索不完整假设空间的一个主要风险:假设空间可能不包含目标函数。
*ID3算法在搜索的每一步都使用当前的所有训练样例,大大降低了对个别训练样例错误的敏感性。
*ID3算法在搜索过程中不进行回溯。所以,它易受无回溯的爬山搜索中的常见风险影响:收敛到局部最优而不是全局最优。
*ID3算法只能处理离散值的属性。信息增益度量存在一个内在偏置,它偏袒具有较多值的属性。
*ID3算法增长树的每一个分支的深度,直到恰好能对训练样例完美地分类,存在决策树过度拟合。

3.具体实现

1.测试数据

1.数据一

色泽,根蒂,敲声,纹理,脐部,触感,好瓜
青绿,蜷缩,浊响,清晰,凹陷,硬滑,好瓜
乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,好瓜
乌黑,蜷缩,浊响,清晰,凹陷,硬滑,好瓜
青绿,蜷缩,沉闷,清晰,凹陷,硬滑,好瓜
浅白,蜷缩,浊响,清晰,凹陷,硬滑,好瓜
青绿,稍蜷,浊响,清晰,稍凹,软粘,好瓜
乌黑,稍蜷,浊响,稍糊,稍凹,软粘,好瓜
乌黑,稍蜷,浊响,清晰,稍凹,硬滑,好瓜
乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,坏瓜
青绿,硬挺,清脆,清晰,平坦,软粘,坏瓜
浅白,硬挺,清脆,模糊,平坦,硬滑,坏瓜
浅白,蜷缩,浊响,模糊,平坦,软粘,坏瓜
青绿,稍蜷,浊响,稍糊,凹陷,硬滑,坏瓜
浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,坏瓜
乌黑,稍蜷,浊响,清晰,稍凹,软粘,坏瓜
浅白,蜷缩,浊响,模糊,平坦,硬滑,坏瓜
青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,坏瓜

2.数据二

天气,温度,湿度,风况,适宜
晴天,高温,中湿,无风,不宜
晴天,高温,中湿,有风,不宜
多云,高温,低湿,无风,适宜
雨天,低温,高湿,无风,适宜
雨天,低温,低湿,无风,适宜
雨天,低温,低湿,有风,不宜
多云,低温,低湿,有风,适宜
晴天,中温,高湿,无风,不宜
晴天,低温,低湿,无风,适宜
雨天,中温,低湿,无风,适宜
晴天,中温,低湿,有风,适宜
多云,中温,中湿,有风,适宜
多云,高温,低湿,无风,适宜
雨天,中温,低湿,有风,不宜

2.代码实现

ID3.java

package package1;
package package1;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
class treeNode{//树节点private String sname;//节点名public treeNode(String str) {sname=str;}public String getsname() {return sname;}ArrayList<String> label=new ArrayList<String>();//和子节点间的边标签ArrayList<treeNode> node=new ArrayList<treeNode>();//对应子节点
}
public class ID3 {private ArrayList<String> label=new ArrayList<String>();//特征标签private ArrayList<ArrayList<String>> date=new ArrayList<ArrayList<String>>();//数据集private ArrayList<ArrayList<String>> test=new ArrayList<ArrayList<String>>();//测试数据集private ArrayList<String> sum=new ArrayList<String>();//分类种类数private String kind;public ID3(String path,String path0) throws FileNotFoundException {//初始化训练数据并得到分类种数getDate(path);//获取测试数据集gettestDate(path0);init(date);}public void init(ArrayList<ArrayList<String>> date) {//得到种类数sum.add(date.get(0).get(date.get(0).size()-1));for(int i=0;i<date.size();i++) {if(sum.contains(date.get(i).get(date.get(0).size()-1))==false) {sum.add(date.get(i).get(date.get(0).size()-1));            }}}//获取测试数据集public void gettestDate(String path) throws FileNotFoundException {String str;int i=0;try {//BufferedReader in=new BufferedReader(new FileReader(path));FileInputStream fis = new FileInputStream(path); InputStreamReader isr = new InputStreamReader(fis, "GB2312"); BufferedReader in = new BufferedReader(isr); while((str=in.readLine())!=null) {String[] strs=str.split(",");ArrayList<String> line =new ArrayList<String>();for(int j=0;j<strs.length;j++) {line.add(strs[j]);//System.out.print(strs[j]+" ");}test.add(line);//System.out.println();i++;}in.close();}catch(Exception e) {e.printStackTrace();}}//获取训练数据集public void getDate(String path) throws FileNotFoundException {String str;int i=0;try {//BufferedReader in=new BufferedReader(new FileReader(path));FileInputStream fis = new FileInputStream(path); InputStreamReader isr = new InputStreamReader(fis, "GB2312"); BufferedReader in = new BufferedReader(isr); while((str=in.readLine())!=null) {if(i==0) {String[] strs=str.split(",");for(int j=0;j<strs.length;j++) {label.add(strs[j]);//System.out.print(strs[j]+" "); }i++;//System.out.println();continue;}String[] strs=str.split(",");ArrayList<String> line =new ArrayList<String>();for(int j=0;j<strs.length;j++) {line.add(strs[j]);//System.out.print(strs[j]+" ");}date.add(line);//System.out.println();i++;}in.close();}catch(Exception e) {e.printStackTrace();}}public double Ent(ArrayList<ArrayList<String>> dat) {//计算总的信息熵int all=0;double amount=0.0;for(int i=0;i<sum.size();i++) {for(int j=0;j<dat.size();j++) {if(sum.get(i).equals(dat.get(j).get(dat.get(0).size()-1))) {    all++;}}if((double)all/dat.size()==0.0) {continue;}   //计算信息熵amount+=((double)all/dat.size())*(Math.log(((double)all/dat.size()))/Math.log(2.0));all=0;}if(amount==0.0) {return 0.0;}return -amount;//计算信息熵}//计算条件熵并返回信息增益值public double condtion(int a,ArrayList<ArrayList<String>> dat) {ArrayList<String> all=new ArrayList<String>();double c=0.0;all.add(dat.get(0).get(a));//得到属性种类for(int i=0;i<dat.size();i++) {if(all.contains(dat.get(i).get(a))==false) {all.add(dat.get(i).get(a));}}ArrayList<ArrayList<String>> plus=new ArrayList<ArrayList<String>>();//部分分组ArrayList<ArrayList<ArrayList<String>>> count=new ArrayList<ArrayList<ArrayList<String>>>();//分组总和for(int i=0;i<all.size();i++) {for(int j=0;j<dat.size();j++) {if(true==all.get(i).equals(dat.get(j).get(a))) {plus.add(dat.get(j));}}count.add(plus);c+=((double)count.get(i).size()/dat.size())*Ent(count.get(i));plus.removeAll(plus);}return (Ent(dat)-c);//返回条件熵}//计算信息增益最大属性public int Gain(ArrayList<ArrayList<String>> dat) {ArrayList<Double> num=new ArrayList<Double>();//保存各信息增益值for(int i=0;i<dat.get(0).size()-1;i++) {num.add(condtion(i,dat));}int index=0;double max=num.get(0);for(int i=1;i<num.size();i++) {if(max<num.get(i)) {max=num.get(i);index=i;}}//System.out.println("<"+label.get(index)+">");return index;}//构建决策树public treeNode creattree(ArrayList<ArrayList<String>> dat) {int index=Gain(dat);treeNode node=new treeNode(label.get(index));ArrayList<String> s=new ArrayList<String>();//属性种类s.add(dat.get(0).get(index));//System.out.println(dat.get(0).get(index));for(int i=1;i<dat.size();i++) {if(s.contains(dat.get(i).get(index))==false) {s.add(dat.get(i).get(index));//System.out.println(dat.get(i).get(index));}}ArrayList<ArrayList<String>> plus=new ArrayList<ArrayList<String>>();//部分分组ArrayList<ArrayList<ArrayList<String>>> count=new ArrayList<ArrayList<ArrayList<String>>>();//分组总和//得到节点下的边标签并分组for(int i=0;i<s.size();i++) {node.label.add(s.get(i));//添加边标签//System.out.print("添加边标签:"+s.get(i)+"  ");for(int j=0;j<dat.size();j++) {if(true==s.get(i).equals(dat.get(j).get(index))) {plus.add(dat.get(j));}}count.add(plus);//System.out.println();//以下添加结点int k;String str=count.get(i).get(0).get(count.get(i).get(0).size()-1);for(k=1;k<count.get(i).size();k++) {if(false==str.equals(count.get(i).get(k).get(count.get(i).get(k).size()-1))) {break;}}if(k==count.get(i).size()) {treeNode dd=new treeNode(str);node.node.add(dd);//System.out.println("这是末端:"+str);}else {//System.out.print("寻找新节点:");node.node.add(creattree(count.get(i)));}plus.removeAll(plus);                }   return node;}   //输出决策树public void print(ArrayList<ArrayList<String>> dat) {System.out.println("构建的决策树如下:\n  ");treeNode node=null;node=creattree(dat);//类put(node);//递归调用   }//用于递归的函数public void put(treeNode node) {System.out.println("结点:"+node.getsname()+"\n");for(int i=0;i<node.label.size();i++) {System.out.println(node.getsname()+"的标签属性:"+node.label.get(i));if(node.node.get(i).node.isEmpty()==true) {System.out.println("叶子结点:"+node.node.get(i).getsname());}else {put(node.node.get(i));}} }//用于对待决策数据进行预测并将结果保存在指定路径public void testdate(ArrayList<ArrayList<String>> test,String path) throws IOException {treeNode node=null;int count=0;node=creattree(this.date);//类try {BufferedWriter out=new BufferedWriter(new FileWriter(path));for(int i=0;i<test.size();i++) {testput(node,test.get(i));//递归调用//System.out.println(kind);for(int j=0;j<test.get(i).size();j++) {out.write(test.get(i).get(j)+",");}if(kind.equals(date.get(i).get(date.get(i).size()-1))==true) {count++;}out.write(kind);out.newLine();}System.out.println("该次分类结果正确率为:"+(double)count/test.size()*100+"%");out.flush();out.close();}catch(IOException e) {e.printStackTrace();}}//用于测试的递归调用public void testput(treeNode node,ArrayList<String> t) {int index=0;for(int i=0;i<this.label.size();i++) {if(this.label.get(i).equals(node.getsname())==true) {index=i;break;}}for(int i=0;i<node.label.size();i++) {if(t.get(index).equals(node.label.get(i))==false) {continue;}if(node.node.get(i).node.isEmpty()==true) {//System.out.println("分类结果为:"+node.node.get(i).getsname());this.kind=node.node.get(i).getsname();//取出分类结果}else {testput(node.node.get(i),t);}}  }public static void main(String[] args) throws IOException {String data=System.getProperty("user.dir") + "\\Data\\data1.txt";//训练数据集String test=System.getProperty("user.dir") + "\\Data\\test.txt";//测试数据集String result=System.getProperty("user.dir") + "\\Data\\result.txt";//预测结果集ID3 id=new ID3(data,test);//初始化数据id.print(id.date);//构建并输出决策树//id.testdate(id.test,result);//预测数据并输出结果}}

ID3算法实现西瓜好坏和天气影响出行的算法相关推荐

  1. 利用sklearn 实现ID3、CART、C4.5 算法挑西瓜

    利用sklearn 实现ID3.CART.C4.5 算法挑西瓜 一.ID3算法 1. 基础知识 2. 划分标准 3. 缺点 4. 利用sklearn实现ID3算法 二.C4.5算法 1. 基础知识 2 ...

  2. 感知器 - 西瓜好坏自动识别——python

    任务描述 本关任务:使用感知机算法建立一个模型,并根据感知器算法流程对模型进行训练,得到一个能够准确对西瓜好坏进行识别的模型. 相关知识 为了完成本关任务,你需要掌握:1.什么是感知器,2.感知器算法 ...

  3. 世界有影响的十位算法大师

    世界有影响的十位算法大师 (排名以姓名首字母为依据)      文 / 范凯 马林 .Don E.Knuth 伟大的智者 -- ,Don E.Knuth中文名:高德纳 (1938-) 算法和程序设计技 ...

  4. 蒙特卡罗算法与拉斯维加斯算法 (西瓜书第十一章11.4题补充)

    书上侧边栏给出了关于蒙特卡罗方法和拉斯维加斯方法的提示: 拉斯维加斯方法和蒙特卡罗方法是两个以著名赌城名字命名的随机化方法两者的主要区别是:若有时间限制,以拉斯维加斯方法或者给出满足要求的解,或者不给 ...

  5. 程序员大厂不一定要进,算法必须要学!收藏89篇精选算法文章

    为什么程序员都需要学算法? 程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点.很多人觉得像人工智能.数据搜索与挖掘这样高薪的工作才用得上算法,觉得算法深不可测 ...

  6. 抢红包算法 c++_字节跳动|垂直策略|算法岗招聘

    [业务介绍] 垂直策略团队成立于2014年,成立之初主要负责今日头条的内容标签,用户标签挖掘,推荐召回,搜索,推送和频道推荐,目前主要负责火山引擎(字节跳动全球技术ToB品牌,目前为几十家外部合作伙伴 ...

  7. 机器学习中四类进化算法的详解(遗传算法、差分进化算法、协同进化算法、分布估计算法)

    1.遗传算法(Genetic Algorithm,GA) GA算法原理 首先我们来介绍进化算法的先驱遗传算法,遗传算法(Genetic Algorithm,简称GA)是一种最基本的进化算法,它是模拟达 ...

  8. fifo算法c语言程序代码,c语言实现fifo算法及代码

    C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供了许多低级处理的功 ...

  9. 豆瓣评分 9.4 的算法巨著,这本书带无数读者入门算法

    说到算法巨著,你可能想到的是<算法导论>这本经典.但在入门算法时,还有一本与之比肩的巨著,不得不提,它就是<算法(第4版)>. 这本豆瓣评分 9.4 的算法巨著,可谓是算法经典 ...

最新文章

  1. 最近做手机端,GPS,微信QQ分享总结的问题
  2. 李铁军教授专访:当数学家遇见人工智能
  3. 根据输入的数字显示日期(新手)
  4. 论文笔记:Triplet Network
  5. Socket编程实现简易聊天室
  6. springboot 工程启动报错之Consider defining a bean of type ‘XXX’ in your configuration.
  7. LeetCode 198. 打家劫舍(DP)
  8. mysql 聚合函数 怎么用在条件里_MySql 中聚合函数增加条件表达式的方法
  9. 解码(五):sws_getContext和sws_scale像素格式和尺寸转换函数详解
  10. ubuntu 查询cpu个数
  11. orac l e数据库第一章
  12. 机器学习模型之集成算法
  13. EFFECTIVE C++ (万字详解)(一)
  14. ps一点等于多少厘米_请问PS中“像素”和“厘米”是怎么换算的?
  15. 体力活动水平的计算机软件著作权查询,软件著作权被竞争对手抢先,著作权保护的客体对象是谁?...
  16. 学习仿今日头条疫情地图+用户画像(echarts)
  17. 自动复制 JavaScript 脚本,JavaScript点击任意位置复制脚本源码
  18. LoRaWAN入网方式以及加密进阶版
  19. PYNQ 采集计划(二)Socket服务端与客户端的搭建,pynq到pc的数据流传输
  20. KATKO KEM640U开关

热门文章

  1. 【信息系统项目管理师】第三章 项目立项管理(考点汇总篇)
  2. web前端课程作业设计:个人简历
  3. MySQL使用全文索引
  4. 按小数点(英文句号)“.“(dot)分割字符串
  5. K-1.4.0 如何防范WiFi Cracking
  6. ios-transform的rotated的应用
  7. c语言大创项目指导过程记录,“大创”项目经验分享讲座成功举办
  8. 同盾设备指纹简单分析
  9. 在线倍增法求LCA专题
  10. ause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.loui