决策分类树算法之ID3,C4.5算法系列
2017-10-29 21:05:39
一、引言
在最开始的时候,我本来准备学习的是C4.5算法,后来发现C4.5算法的核心还是ID3算法,所以又辗转回到学习ID3算法了,因为C4.5是他的一个改进。至于是什么改进,在后面的描述中我会提到。 二、ID3算法
ID3算法是一种分类决策树算法。他通过一系列的规则,将数据最后分类成决策树的形式。分类的根据是用到了熵这个概念。熵在物理这门学科中就已经出现过,表示是一个物质的稳定度,在这里就是分类的纯度的一个概念。公式为:

 
在ID3算法中,是采用Gain信息增益来作为一个分类的判定标准的。他的定义为:

 
每次选择属性中信息增益最大作为划分属性,在这里本人实现了一个java版本的ID3算法,为了模拟数据的可操作性,就把数据写到一个input.txt文件中,作为数据源,格式如下:
    [java] view plain copy  Day OutLook Temperature Humidity Wind PlayTennis  1 Sunny Hot High Weak No  2 Sunny Hot High Strong No  3 Overcast Hot High Weak Yes  4 Rainy Mild High Weak Yes  5 Rainy Cool Normal Weak Yes  6 Rainy Cool Normal Strong No  7 Overcast Cool Normal Strong Yes  8 Sunny Mild High Weak No  9 Sunny Cool Normal Weak Yes  10 Rainy Mild Normal Weak Yes  11 Sunny Mild Normal Strong Yes  12 Overcast Mild High Strong Yes  13 Overcast Hot Normal Weak Yes  14 Rainy Mild High Strong No   
PalyTennis 属性为结构属性,是作为类标识用的,中间的OutLool,Temperature,Humidity,Wind才是划分属性,通过将源数据与执行程序分 类,这样可以模拟巨大的数据量了。下面是ID3的主程序类,本人将ID3的算法进行了包装,对外只开放了一个构建决策树的方法,在构造函数时候,只需传入 一个数据路径文件即可:
    [java] view plain copy  package DataMing_ID3;      import java.io.BufferedReader;  import java.io.File;  import java.io.FileReader;  import java.io.IOException;  import java.util.ArrayList;  import java.util.HashMap;  import java.util.Iterator;  import java.util.Map;  import java.util.Map.Entry;  import java.util.Set;      /**  * ID3算法实现类  *    * @author lyq  *    */  public class ID3Tool {      // 类标号的值类型      private final String YES = "Yes";      private final String NO = "No";          // 所有属性的类型总数,在这里就是data源数据的列数      private int attrNum;      private String filePath;      // 初始源数据,用一个二维字符数组存放模仿表格数据      private String[][] data;      // 数据的属性行的名字      private String[] attrNames;      // 每个属性的值所有类型      private HashMap<String, ArrayList<String>> attrValue;          public ID3Tool(String filePath) {          this.filePath = filePath;          attrValue = new HashMap<>();      }          /**      * 从文件中读取数据      */      private void readDataFile() {          File file = new File(filePath);          ArrayList<String[]> dataArray = new ArrayList<String[]>();              try {              BufferedReader in = new BufferedReader(new FileReader(file));              String str;              String[] tempArray;              while ((str = in.readLine()) != null) {                  tempArray = str.split(" ");                  dataArray.add(tempArray);              }         

下一页
返回列表
返回首页
©2021 艾叔编程|大数据学习网|大数据学习的精选知识仓库 电脑版