决策分类树算法之ID3,C4.5算法系列

2023-11-19

一、引言

在最开始的时候,我本来准备学习的是C4.5算法,后来发现C4.5算法的核心还是ID3算法,所以又辗转回到学习ID3算法了,因为C4.5是他的一个改进。至于是什么改进,在后面的描述中我会提到。

二、ID3算法

ID3算法是一种分类决策树算法。他通过一系列的规则,将数据最后分类成决策树的形式。分类的根据是用到了熵这个概念。熵在物理这门学科中就已经出现过,表示是一个物质的稳定度,在这里就是分类的纯度的一个概念。公式为:


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


每次选择属性中信息增益最大作为划分属性,在这里本人实现了一个java版本的ID3算法,为了模拟数据的可操作性,就把数据写到一个input.txt文件中,作为数据源,格式如下:

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的算法进行了包装,对外只开放了一个构建决策树的方法,在构造函数时候,只需传入一个数据路径文件即可:

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);
			}
			in.close();
		} catch (IOException e) {
			e.getStackTrace();
		}

		data = new String[dataArray.size()][];
		dataArray.toArray(data);
		attrNum = data[0].length;
		attrNames = data[0];

		/*
		 * for(int i=0; i<data.length;i++){ for(int j=0; j<data[0].length; j++){
		 * System.out.p
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

决策分类树算法之ID3,C4.5算法系列 的相关文章

随机推荐

  • stm32局部变量定义过大导致栈溢出

    我在stm32做归一化以及自相关的项目时 一开始直接定义了长度为8192的数组 进行自相关 单片机一直没有反应 上位机不输出信息 然后我把点数改为128后就能正常输出了 并且在调试后 我发现最高能运行的点数是512 经过上网查询我终于发现了
  • 容器适配器 -------------- stack 、queue、priority_queue的使用以及 为什么默认使用deque作为底层容器?

    什么是适配器 适配器是一种设计模式 设计模式是一套被反复使用的 多数人知晓的 经过分类编目的 代码设计经验的总结 该种模式是将一个类的接口转换成客户希望的另外一个接口 1 为什么将stack queue和priority queue称作为容
  • 第十六次CCF认证模拟试题(201903-2):二十四点(Java完整版)

    最近在练习算法 觉得CCF的算法题都还不错 就做了一下子 试卷原题 Java版解法 import java util ArrayList import java util Scanner public class Main public s
  • 不能不熬夜了

    我知道 熬夜不好 但是 现在 白天单位被鸟事所忙 没事磨洋工也得装个样子 看不了程序了 所以 只能把工作当作工作外 把业余当作工作了 况且 家庭压力太大
  • 如何用chrome查看post get及返回的数据

    chrome浏览器按下F12打开开发者工具 点击Network 找到过滤器 筛选XHR Method那一列会显示POST GET 转载于 https www cnblogs com yancongyang p 8142669 html
  • js调用angularjs的函数

    function test txm 获得对象 var appElement document querySelector ng controller MainCtrl 获得scope var scope angular element ap
  • 抖音短视频seo源码开发部署-技术分享(四)

    一 抖音短视频seo源码开发流程 抖音短视频SEO源码开发流程如下 1 分析需求 首先需要明确你的SEO目标 分析竞争对手 了解抖音短视频平台的规则 选定目标关键词和主题 2 编写代码 根据需求编写代码 并将其集成到你的应用程序或网站中 3
  • Association Class VS Full Class

    详细分析请见 http etutorials org Programming UML Chapter 6 Class Diagrams Advanced Concepts Association Class 1 关联类的必要性 关联类隔离了
  • X210开发板(S5PV210芯片)uboot中SD卡分区分析(init_raw_area_table函数)

    1 init raw area table函数调用关系 start s start armboot mmc initialize mmc init mmc startup init raw area table 2 struct raw a
  • visio画图常见问题解答

    使用visio画图有很多优点 与office相关产品完全兼容 可随时修改 操作简单等等 这里不再多说 我们在使用这一工具的时候常常会遇到一些小问题 但是这些小问题看似小 有的时候却会让我们折腾上半天 废话少说 现在把常见的几个问题的解决方案
  • java数组求和函数_Excel表格求和,难道你只会用SUM函数?(下)

    Excel求和函数 绝大部分人只会用SUM函数 今天再来分享4个求和函数 年前集齐8个求和函数年后开运 1 使用SUMXMY2函数返回两个数组中对应值差的平方和 SUMXMY2函数用于返回两数组中对应数值之差的平方和 函数语法 SUMXMY
  • 如何给keepalived配置vip(虚拟ip)

    首先为了测试机器 准备两台服务器 host1 172 28 23 73 host2 172 28 23 96 虚拟ip 172 28 23 100 第一步 在线安装keepalived中间件 sudo yum install y keepa
  • CMake Error: Cannot determine link language for target “test“.

    问题来源 project kinodyntest LANGUAGES CXX 先指定语言c add executable 后面传入的文件是 c 文件导致cmake报错 c 文件为 cpp
  • 论文笔记:STMARL: A Spatio-Temporal Multi-AgentReinforcement Learning Approach for Cooperative Traffic

    0 abstract 智能交通灯控制系统的开发对于智能交通管理至关重要 虽然已经做出了一些努力以孤立的形式来优化单个红绿灯的使用 但相关研究在很大程度上忽略了多路口红绿灯的使用受到空间影响的事实 以及历史交通状态的时间依赖性 为此 在本文中
  • 用microPython写一个ESP32的OLED的程序

    好的 我可以给你提供一些有关使用 MicroPython 在 ESP32 上编写 OLED 显示屏程序的指导 首先 你需要在 ESP32 上安装 MicroPython 固件 你可以使用 esptool 工具将 MicroPython 固件
  • iscsi多路径配置方式

    学习一个服务的过程 1 此服务器的概述 名字 功能 特点 端口号 2 安装 3 配置文件的位置 4 服务启动关闭脚本 查看端口 5 此服务的使用方法 6 修改配置文件 实战举例 7 排错 从下到上 从内到外 内容 实战 配置IP SAN多路
  • Linux升级命令yum update

    Linux升级命令有两个分别是yum upgrade和yum update 这个两个命令是有区别的 代码如下 yum y update 升级所有包同时也升级软件和系统内核 代码如下 yum y upgrade 只升级所有包 不升级软件和系统
  • Memcach基础使用

    memcache 基础课程 使用场景 memcache 服务器端的安装 推荐使用memcached memcached是memchache的升级版本 sudo su apt get install memcached usr bin mem
  • 02-12306验证码预处理(分割、转存dat、解析dat文件)

    import cv2 as cv import numpy as np import os import binascii temp path r F python StockAnalyzer test test avi img path
  • 决策分类树算法之ID3,C4.5算法系列

    一 引言 在最开始的时候 我本来准备学习的是C4 5算法 后来发现C4 5算法的核心还是ID3算法 所以又辗转回到学习ID3算法了 因为C4 5是他的一个改进 至于是什么改进 在后面的描述中我会提到 二 ID3算法 ID3算法是一种分类决策