ID3决策树的Java实现
package DecisionTree; import java.io.*;
import java.util.*; public class ID3 { //节点类
public class DTNode {
private String attribute;
private HashMap<String, DTNode> children = new HashMap<String, DTNode>();
public String getAttribute() {
return attribute;
}
public void setAttribute(String attribute) {
this.attribute = attribute;
}
public HashMap<String, DTNode> getChildren() {
return children;
}
public void setChildren(HashMap<String, DTNode> children) {
this.children = children;
}
} private String decisionColumn; //决定字段 public String getDecisionColumn() {
return decisionColumn;
} public void setDecisionColumn(String decisionColumn) {
this.decisionColumn = decisionColumn;
} //统计每个属性在集合中出现的次数
public HashMap<String, Integer> getTypeCounts(ArrayList<String> dataset) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
for (int i = 0; i < dataset.size(); i++) {
String key = dataset.get(i);
if(!map.containsKey(key))
map.put(key, 1);
else
map.put(key, map.get(key)+1);
}
return map;
} //获取key的indexlist
public ArrayList<Integer> getIndex(String key, ArrayList<String> dataset){
ArrayList<Integer> indexlist = new ArrayList<Integer>(); for(int i = 0; i < dataset.size(); i++){
if(key.equals(dataset.get(i)))
indexlist.add(Integer.valueOf(i));
}
return indexlist;
} //根据index获取数据集
public ArrayList<String> getSubset(ArrayList<Integer> indexlist, ArrayList<String> dataset) {
ArrayList<String> subset = new ArrayList<String>();
for(Integer i : indexlist){
subset.add(dataset.get(i.intValue()));
}
return subset;
} //计算信息熵
public double getEntropy(ArrayList<String> dataset) {
double entropy = 0;
double prob = 0;
int sum = dataset.size();
HashMap<String, Integer> map = getTypeCounts(dataset);
Iterator<String> iter = map.keySet().iterator();
while(iter.hasNext()){
String key = iter.next();
prob = (double)map.get(key).intValue()/sum;
entropy += -1*prob*Math.log10(prob)/Math.log10(2);
}
return entropy;
} //计算已知条件下的信息熵
public double getConditionEntropy(HashMap<String, ArrayList<String>> dataset, String IndexCol) {
double entropy = 0;
double prob = 0;
int sum = dataset.get(IndexCol).size();
HashMap<String, Integer> map = getTypeCounts(dataset.get(IndexCol));
Iterator<String> iter = map.keySet().iterator();
while(iter.hasNext()){
String key = iter.next();
prob = (double)map.get(key)/sum;
entropy+=prob*getEntropy(getSubset(getIndex(key,dataset.get(IndexCol)),dataset.get(this.decisionColumn)));
}
return entropy;
} //建立决策树
public DTNode buildDT(HashMap<String, ArrayList<String>>dataset) { DTNode node = new DTNode();
double info_entropy = getEntropy(dataset.get(this.decisionColumn));
//递归结束条件
if(info_entropy == 0){
node.setAttribute((dataset.get(this.decisionColumn).get(0)));
return node;
} //求出拥有最小熵数据集的column,即最大entropy gain
double max_gain = 0; //设置默认值
double gain = 0;
String max_column="";
Iterator<String> entropy_iter = dataset.keySet().iterator(); while(entropy_iter.hasNext()){
String key = entropy_iter.next();
if(key.equals(this.decisionColumn))
continue;
gain = getEntropy(dataset.get(decisionColumn)) - getConditionEntropy(dataset,key); //计算信息增益
if(gain > max_gain){
max_gain = gain;
max_column = key;
}
} node.setAttribute(max_column);
ArrayList<String> ds = dataset.get(max_column); //最小熵数据集 //生成新数据集
Iterator<String> iter = getTypeCounts(ds).keySet().iterator();
while(iter.hasNext()){
String key = iter.next();
HashMap<String, ArrayList<String>> subset = new HashMap<String, ArrayList<String>>();
DTNode childNode;
ArrayList<Integer> indexlist = getIndex(key,ds);
Iterator<String> sub_iter = dataset.keySet().iterator();
while(sub_iter.hasNext()){
String sub_key = sub_iter.next();
if(!sub_key.equals(max_column))
subset.put(sub_key, getSubset(indexlist,dataset.get(sub_key)));
} childNode = buildDT(subset);
node.getChildren().put(key, childNode);
} return node;
} //输出树
public void printDT(DTNode root){ if(root == null)
return;
System.out.println(root.attribute);
if(root.getChildren() == null)
return; Iterator<String> iter = root.getChildren().keySet().iterator();
while(iter.hasNext()){
String key = iter.next();
System.out.print(key+" ");
printDT(root.getChildren().get(key));
}
} //读取源文件
public HashMap<String,ArrayList<String>> read(String path){
HashMap<String,ArrayList<String>> dataset = new HashMap<String,ArrayList<String>>();
try{
File file = new File(path);
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader input = new InputStreamReader(new FileInputStream(file),"UTF-8");
BufferedReader read = new BufferedReader(input);
String line = null; ArrayList<ArrayList<String>> ds = new ArrayList<ArrayList<String>>();
while((line = read.readLine()) != null){
String[] data = line.split(",");
ArrayList<String> temp = new ArrayList<String>();
for(int i = 0; i < data.length; i++)
temp.add(data[i]);
ds.add(temp);
} for(int i = 0; i < ds.get(0).size(); i++){
ArrayList<String> newds = new ArrayList<String>();
for(int j = 0; j < ds.size(); j++){
newds.add(ds.get(j).get(i));
}
String key = newds.get(0);
newds.remove(0);
dataset.put(key,newds);
}
input.close();
}
}catch(Exception e){
e.printStackTrace();
} return dataset;
} public static void main(String[] args) {
ID3 tree = new ID3();
HashMap<String,ArrayList<String>> ds = tree.read("C:"+File.separator+"Users"+File.separator+"mhua005"+File.separator+
"Desktop"+File.separator+"sample.txt");
tree.setDecisionColumn("play");
ArrayList<String> attr = new ArrayList<String>();
attr.add("outlook");
attr.add("temperature");
attr.add("humidity");
attr.add("windy");
attr.add("play");
DTNode root = tree.buildDT(ds);
tree.printDT(root);
}
}
源文件内容:
outlook,temperature,humidity,windy,play
sunny,hot,high,FALSE,no
sunny,hot,high,TRUE,no
overcast,hot,high,FALSE,yes
rainy,mild,high,FALSE,yes
rainy,cool,normal,FALSE,yes
rainy,cool,normal,TRUE,no
overcast,cool,normal,TRUE,yes
sunny,mild,high,FALSE,no
sunny,cool,normal,FALSE,yes
rainy,mild,normal,FALSE,yes
sunny,mild,normal,TRUE,yes
overcast,mild,high,TRUE,yes
overcast,hot,normal,FALSE,yes
rainy,mild,high,TRUE,no
ID3决策树的Java实现的更多相关文章
- ID3决策树预测的java实现
刚才写了ID3决策树的建立,这个是通过决策树来进行预测.这里主要用到的就是XML的遍历解析,比较简单. 关于xml的解析,参考了: http://blog.csdn.net/soszou/articl ...
- ID3算法(Java实现)
数据存储文件:buycomputer.properties #数据个数 datanum=14 #属性及属性值 nodeAndAttribute=年龄:青/中/老,收入:高/中/低,学生:是/否,信誉: ...
- Python3实现机器学习经典算法(三)ID3决策树
一.ID3决策树概述 ID3决策树是另一种非常重要的用来处理分类问题的结构,它形似一个嵌套N层的IF…ELSE结构,但是它的判断标准不再是一个关系表达式,而是对应的模块的信息增益.它通过信息增益的大小 ...
- 决策树ID3算法的java实现(基本试用所有的ID3)
已知:流感训练数据集,预定义两个类别: 求:用ID3算法建立流感的属性描述决策树 流感训练数据集 No. 头痛 肌肉痛 体温 患流感 1 是(1) 是(1) 正常(0) 否(0) 2 是(1) 是(1 ...
- 决策树ID3算法的java实现
决策树的分类过程和人的决策过程比较相似,就是先挑“权重”最大的那个考虑,然后再往下细分.比如你去看医生,症状是流鼻涕,咳嗽等,那么医生就会根据你的流鼻涕这个权重最大的症状先认为你是感冒,接着再根据你咳 ...
- 决策树ID3算法的java实现(基本适用所有的ID3)
已知:流感训练数据集,预定义两个类别: 求:用ID3算法建立流感的属性描述决策树 流感训练数据集 No. 头痛 肌肉痛 体温 患流感 1 是(1) 是(1) 正常(0) 否(0) 2 是(1) 是(1 ...
- ID3决策树---Java
1)熵与信息增益: 2)以下是实现代码: //import java.awt.color.ICC_ColorSpace; import java.io.*; import java.util.Arra ...
- java编写ID3决策树
说明:每个样本都会装入Data样本对象,决策树生成算法接收的是一个Array<Data>样本列表,所以构建测试数据时也要符合格式,最后生成的决策树是树的根节点,通过里面提供的showTre ...
- python ID3决策树实现
环境:ubuntu 16.04 python 3.6 数据来源:UCI wine_data(比较经典的酒数据) 决策树要点: 1. 如何确定分裂点(CART ID3 C4.5算法有着对应的分裂计算方式 ...
随机推荐
- 炫酷的jquery瀑布流
最近做了一个瀑布流效果,思路很简单 首先计算屏幕一行可以放多少个图片,然后在第二行开始,计算每一列的高度并取出最小值,将新图片加载在最小列高度下,如此循环,并且设定一个条件,当滑动到一定距离后,开始重 ...
- 【HDU】1847 Good Luck in CET-4 Everybody!
http://acm.hdu.edu.cn/showproblem.php?pid=1847 题意:同nim..不过只有一堆..每次取2的幂次..即1.2.4....等,n<=1000 #inc ...
- 《你必须知道的.NET》书中对OCP(开放封闭)原则的阐述
开放封闭原则(OCP,Open Closed Principle)是面向对象原则的核心.由于软件设计本身所追求的墓边就是封装变化,降低耦合,而开放封闭原则就是对这一目标的直接体现.(你必须知道的.NE ...
- JSP 连接MySQL 5.1
//数据库为cc, 数据表emp/*CREATE DATABASE `cc` /*!40100 COLLATE 'utf8_unicode_ci' */ CREATE TABLE `emp` ( `e ...
- [转]关于event的两个常被忽略的api:isDefaultPrevented()和preventDefault()
今天在robert penner(as3 singal的作者)的一篇blog文中顺藤摸瓜到了darron schall的另外一篇blog文(Creating Default, Cancelable E ...
- Apple Special Event, October 2013 (1080p)(苹果发布会)
Apple iPhone 5C(16G) 3G智能手机(粉色 北京联通惊喜合约价3899,购机送费含200话费,率先上市,限量抢购)
- [LintCode] Sort Integers II 整数排序之二
Given an integer array, sort it in ascending order. Use quick sort, merge sort, heap sort or any O(n ...
- QSpinBox 和 QSlider 联合使用方法
在Qt中,有时候我们想要联合QSpinBox 和 QSlider,使得移动滑块,QSpinBox中的数据会变化,或者我们在QSpinBox中输入一个数值,响应的滑块也会变化,如下图所示:
- vim operation
note: 转自 www.quora.com ,很好的网站. 具体链接如下: https://www.quora.com/What-are-some-impressive-demos-of-Vim- ...
- ETL
1.ETL的定义 ETL分别是“Extract”.“ Transform” .“Load”三个单词的首字母缩写也就是“抽取”.“转换”.“装载”,但我们日常往往简称其为数据抽取. ETL是BI/DW ...