本文实例讲述了java实现的决策树算法。分享给大家供大家参考,具体如下:
决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。
决策树构造可以分两步进行。第一步,决策树的生成:由训练样本集生成决策树的过程。一般情况下,训练样本数据集是根据实际需要有历史的、有一定综合程度的,用于数据分析处理的数据集。第二步,决策树的剪枝:决策树的剪枝是对上一阶段生成的决策树进行检验、校正和修下的过程,主要是用新的样本数据集(称为测试数据集)中的数据校验决策树生成过程中产生的初步规则,将那些影响预衡准确性的分枝剪除。
java实现代码如下:
package demo;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class DicisionTree {
public static void main(String[] args) throws Exception {
System.out.print("我们测试结果:");
String[] attrNames = new String[] { "AGE", "INCOME", "STUDENT",
"CREDIT_RATING" };
// 读取样本集
Map> samples = readSamples(attrNames);
// 生成决策树
Object decisionTree = generateDecisionTree(samples, attrNames);
// 输出决策树
outputDecisionTree(decisionTree, 0, null);
}
/**
* 读取已分类的样本集,返回Map:分类 -> 属于该分类的样本的列表
*/
static Map> readSamples(String[] attrNames) {
// 样本属性及其所属分类(数组中的最后一个元素为样本所属分类)
Object[][] rawData = new Object[][] {
{ "<30 ", "High ", "No ", "Fair ", "0" },
{ "<30 ", "High ", "No ", "Excellent", "0" },
{ "30-40", "High ", "No ", "Fair ", "1" },
{ ">40 ", "Medium", "No ", "Fair ", "1" },
{ ">40 ", "Low ", "Yes", "Fair ", "1" },
{ ">40 ", "Low ", "Yes", "Excellent", "0" },
{ "30-40", "Low ", "Yes", "Excellent", "1" },
{ "<30 ", "Medium", "No ", "Fair ", "0" },
{ "<30 ", "Low ", "Yes", "Fair ", "1" },
{ ">40 ", "Medium", "Yes", "Fair ", "1" },
{ "<30 ", "Medium", "Yes", "Excellent", "1" },
{ "30-40", "Medium", "No ", "Excellent", "1" },
{ "30-40", "High ", "Yes", "Fair ", "1" },
{ ">40 ", "Medium", "No ", "Excellent", "0" } };
// 读取样本属性及其所属分类,构造表示样本的Sample对象,并按分类划分样本集
Map> ret = new HashMap>();
for (Object[] row : rawData) {
Sample sample = new Sample();
int i = 0;
for (int n = row.length - 1; i < n; i++)
sample.setAttribute(attrNames[i], row[i]);
sample.setCategory(row[i]);
List samples = ret.get(row[i]);
if (samples == null) {
samples = new LinkedList();
ret.put(row[i], samples);
}
samples.add(sample);
}
return ret;
}
/**
* 构造决策树
*/
static Object generateDecisionTree(
Map> categoryToSwww.cppcns.comamples, String[] attrNames) {
// 如果只有一个样本,将该样本所属分类作为新样本的分类
if (categoryToSamples.size() == 1)
return categoryToSamples.keySet().iterator().next();
// 如果没有供决策的属性,则将样本集中具有最多样本的分类作为新样本的分类,即投票选举出分类
if (attrNames.length == 0) {
int max = 0;
Object maxCategory = null;
for (Entry> entry : categoryToSamples
.entrySet()) {
int cur = entry.getValue().size();
if (cur > max) {
max = cur;
maxCategory = entry.http://www.cppcns.comld(attrValue, child);
}
return tree;
}
/**
* 选取最优测试属性。最优是指如果根据选取的测试属性分支,则从各分支确定新样本
* 的分类需要的信息量之和最小,这等价于确定新样本的测试属性获得的信息增益最大
* 返回数组:选取的属性下标、信息量之和、Map(属性值->(分类->样本列表))
*/
static Object[] chooseBestTestAttribute(
Map> categoryToSamples, String[] attrNames) {
int minIndex = -1; // 最优属性下标
double minValue = Double.MAX_VALUE; // 最小信息量
Map>> minSplits = null; // 最优分支方案
// 对每一个属性,计算将其作为测试属性的情况下在各分支确定新样本的分类需要的信息量之和,选取最小为最优
for (int attrIndex = 0; attrIndex < attrNames.length; attrIndex++) {
int allCount = 0; // 统计样本总数的计数器
// 按当前属性构建Map:属性值->(分类->样本列表)
Map>> curSplits =
/* NEW LINE */new HashMap>>();
for (Entry> entry : categoryToSamples
http://www.cppcns.com Object> children = new HashMap();
public Tree(String attribute) {
this.attribute = attribute;
}
public String getAttribute() {
return attribute;
}
public Object getChild(Object attrValue) {
return children.get(attrValue);
}
public void setChild(Object attrValue, Object child) {
children.put(attrValue, child);
}
public Set getAttributeValues() {
return children.keySet();
}
}
}
运行结果:
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
本文标题: Java实现的决策树算法完整实例
本文地址: http://www.cppcns.com/ruanjian/java/212037.html