决策树ID3算法的java实现(基本试用所有的ID3)
已知:流感训练数据集,预定义两个类别;
求:用ID3算法建立流感的属性描述决策树
流感训练数据集
No. |
头痛 |
肌肉痛 |
体温 |
患流感 |
1 |
是(1) |
是(1) |
正常(0) |
否(0) |
2 |
是(1) |
是(1) |
高(1) |
是(1) |
3 |
是(1) |
是(1) |
很高(2) |
是(1) |
4 |
否(0) |
是(1) |
正常(0) |
否(0) |
5 |
否(0) |
否(0) |
高(1) |
否(0) |
6 |
否(0) |
是(1) |
很高(2) |
是(1) |
7 |
是(1) |
否(0) |
高(1) |
是(1) |
原理分析:
在决策树的每一个非叶子结点划分之前,先计算每一个属性所带来的信息增益,选择最大信息增益的属性来划分,因为信息增益越大,区分样本的能力就越强,越具有代表性其中。
信息熵计算:
信息增益:
计算的结果(草稿上的字丑别喷):
--------------------------------------------------------------------------------------------------------------------------------------------
*************************************************************************************************************
************************实现*********************************************
package ID3Tree;
import java.util.Comparator;;
@SuppressWarnings("rawtypes")
public class Comparisons implements Comparator
{
public int compare(Object a, Object b) throws ClassCastException{
String str1 = (String)a;
String str2 = (String)b;
return str1.compareTo(str2);
}
}
package ID3Tree; public class Entropy {
//信息熵
public static double getEntropy(int x, int total)
{
if (x == 0)
{
return 0;
}
double x_pi = getShang(x,total);
return -(x_pi*Logs(x_pi));
} public static double Logs(double y)
{
return Math.log(y) / Math.log(2);
} public static double getShang(int x, int total)
{
return x * Double.parseDouble("1.0") / total;
}
}
package ID3Tree; public class TreeNode {
//父节点
TreeNode parent;
//指向父节点的属性
String parentAttribute;
String nodeName;
String[] attributes;
TreeNode[] childNodes;
}
package ID3Tree;
import java.util.*; public class UtilID3 {
TreeNode root;
private boolean[] flag;
//训练集
private Object[] trainArrays;
//节点索引
private int nodeIndex;
public static void main(String[] args)
{
//初始化训练集数组
Object[] arrays = new Object[]{
new String[]{"是","是","正常","否"},
new String[]{"是","是","高","是"},
new String[]{"是","是","很高","是"},
new String[]{"否","是","正常","否"},
new String[]{"否","否","高","否"},
new String[]{"否","是","很高","是"},
new String[]{"是","否","高","是"}};
UtilID3 ID3Tree = new UtilID3();
ID3Tree.create(arrays, 3);
} //创建
public void create(Object[] arrays, int index)
{
this.trainArrays = arrays;
initial(arrays, index);
createDTree(arrays);
printDTree(root);
} //初始化
public void initial(Object[] dataArray, int index)
{
this.nodeIndex = index; //数据初始化
this.flag = new boolean[((String[])dataArray[0]).length];
for (int i = 0; i<this.flag.length; i++)
{
if (i == index)
{
this.flag[i] = true;
}
else
{
this.flag[i] = false;
}
}
} //创建决策树
public void createDTree(Object[] arrays)
{
Object[] ob = getMaxGain(arrays);
if (this.root == null)
{
this.root = new TreeNode();
root.parent = null;
root.parentAttribute = null;
root.attributes = getAttributes(((Integer)ob[1]).intValue());
root.nodeName = getNodeName(((Integer)ob[1]).intValue());
root.childNodes = new TreeNode[root.attributes.length];
insert(arrays, root);
}
} //插入决策树
public void insert(Object[] arrays, TreeNode parentNode)
{
String[] attributes = parentNode.attributes;
for (int i = 0; i < attributes.length; i++)
{
Object[] Arrays = pickUpAndCreateArray(arrays, attributes[i],getNodeIndex(parentNode.nodeName));
Object[] info = getMaxGain(Arrays);
double gain = ((Double)info[0]).doubleValue();
if (gain != 0)
{
int index = ((Integer)info[1]).intValue();
TreeNode currentNode = new TreeNode();
currentNode.parent = parentNode;
currentNode.parentAttribute = attributes[i];
currentNode.attributes = getAttributes(index);
currentNode.nodeName = getNodeName(index);
currentNode.childNodes = new TreeNode[currentNode.attributes.length];
parentNode.childNodes[i] = currentNode;
insert(Arrays, currentNode);
}
else
{
TreeNode leafNode = new TreeNode();
leafNode.parent = parentNode;
leafNode.parentAttribute = attributes[i];
leafNode.attributes = new String[0];
leafNode.nodeName = getLeafNodeName(Arrays);
leafNode.childNodes = new TreeNode[0];
parentNode.childNodes[i] = leafNode;
}
}
} //输出
public void printDTree(TreeNode node)
{
System.out.println(node.nodeName);
TreeNode[] childs = node.childNodes;
for (int i = 0; i < childs.length; i++)
{
if (childs[i] != null)
{
System.out.println("如果:"+childs[i].parentAttribute);
printDTree(childs[i]);
}
}
} //剪取数组
public Object[] pickUpAndCreateArray(Object[] arrays, String attribute, int index)
{
List<String[]> list = new ArrayList<String[]>();
for (int i = 0; i < arrays.length; i++)
{
String[] strs = (String[])arrays[i];
if (strs[index].equals(attribute))
{
list.add(strs);
}
}
return list.toArray();
} //取得节点名
public String getNodeName(int index)
{
String[] strs = new String[]{"头痛","肌肉痛","体温","患流感"};
for (int i = 0; i < strs.length; i++)
{
if (i == index)
{
return strs[i];
}
}
return null;
} //取得叶子节点名
public String getLeafNodeName(Object[] arrays)
{
if (arrays != null && arrays.length > 0)
{
String[] strs = (String[])arrays[0];
return strs[nodeIndex];
}
return null;
} //取得节点索引
public int getNodeIndex(String name)
{
String[] strs = new String[]{"头痛","肌肉痛","体温","患流感"};
for (int i = 0; i < strs.length; i++)
{
if (name.equals(strs[i]))
{
return i;
}
}
return -1;
} //得到最大信息增益
public Object[] getMaxGain(Object[] arrays)
{
Object[] result = new Object[2];
double gain = 0;
int index = -1;
for (int i = 0; i<this.flag.length; i++)
{
if (!this.flag[i])
{
double value = gain(arrays, i);
if (gain < value)
{
gain = value;
index = i;
}
}
}
result[0] = gain;
result[1] = index;
if (index != -1)
{
this.flag[index] = true;
}
return result;
} //取得属性数组
public String[] getAttributes(int index)
{
@SuppressWarnings("unchecked")
TreeSet<String> set = new TreeSet<String>(new Comparisons());
for (int i = 0; i<this.trainArrays.length; i++)
{
String[] strs = (String[])this.trainArrays[i];
set.add(strs[index]);
}
String[] result = new String[set.size()];
return set.toArray(result); } //计算信息增益
public double gain(Object[] arrays, int index)
{
String[] playBalls = getAttributes(this.nodeIndex);
int[] counts = new int[playBalls.length];
for (int i = 0; i<counts.length; i++)
{
counts[i] = 0;
} for (int i = 0; i<arrays.length; i++)
{
String[] strs = (String[])arrays[i];
for (int j = 0; j<playBalls.length; j++)
{
if (strs[this.nodeIndex].equals(playBalls[j]))
{
counts[j]++;
}
}
} double entropyS = 0;
for (int i = 0;i <counts.length; i++)
{
entropyS = entropyS + Entropy.getEntropy(counts[i], arrays.length);
} String[] attributes = getAttributes(index);
double total = 0;
for (int i = 0; i<attributes.length; i++)
{
total = total + entropy(arrays, index, attributes[i], arrays.length);
}
return entropyS - total;
} public double entropy(Object[] arrays, int index, String attribute, int totals)
{
String[] playBalls = getAttributes(this.nodeIndex);
int[] counts = new int[playBalls.length];
for (int i = 0; i < counts.length; i++)
{
counts[i] = 0;
} for (int i = 0; i < arrays.length; i++)
{
String[] strs = (String[])arrays[i];
if (strs[index].equals(attribute))
{
for (int k = 0; k<playBalls.length; k++)
{
if (strs[this.nodeIndex].equals(playBalls[k]))
{
counts[k]++;
}
}
}
} int total = 0;
double entropy = 0;
for (int i = 0; i < counts.length; i++)
{
total = total +counts[i];
} for (int i = 0; i < counts.length; i++)
{
entropy = entropy + Entropy.getEntropy(counts[i], total);
}
return Entropy.getShang(total, totals)*entropy;
}
}
决策树ID3算法的java实现(基本试用所有的ID3)的更多相关文章
- 决策树ID3算法的java实现(基本适用所有的ID3)
已知:流感训练数据集,预定义两个类别: 求:用ID3算法建立流感的属性描述决策树 流感训练数据集 No. 头痛 肌肉痛 体温 患流感 1 是(1) 是(1) 正常(0) 否(0) 2 是(1) 是(1 ...
- 决策树ID3算法的java实现
决策树的分类过程和人的决策过程比较相似,就是先挑“权重”最大的那个考虑,然后再往下细分.比如你去看医生,症状是流鼻涕,咳嗽等,那么医生就会根据你的流鼻涕这个权重最大的症状先认为你是感冒,接着再根据你咳 ...
- ID3算法(Java实现)
数据存储文件:buycomputer.properties #数据个数 datanum=14 #属性及属性值 nodeAndAttribute=年龄:青/中/老,收入:高/中/低,学生:是/否,信誉: ...
- ID3算法(2)
今天,我来讲解的是决策树.对于决策树来说,主要有两种算法:ID3算法和C4.5算法.C4.5算法是 对ID3算法的改进.今天主要先讲ID3算法,之后会讲C4.5算法和随机森林等. Contents ...
- ID3算法Java实现
ID3算法java实现 1 ID3算法概述 1.1 信息熵 熵是无序性(或不确定性)的度量指标.假如事件A的全概率划分是(A1,A2,...,An),每部分发生的概率是(p1,p2,...,pn).那 ...
- 数据挖掘之决策树ID3算法(C#实现)
决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般 ...
- 决策树 -- ID3算法小结
ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归 ...
- 决策树-预测隐形眼镜类型 (ID3算法,C4.5算法,CART算法,GINI指数,剪枝,随机森林)
1. 1.问题的引入 2.一个实例 3.基本概念 4.ID3 5.C4.5 6.CART 7.随机森林 2. 我们应该设计什么的算法,使得计算机对贷款申请人员的申请信息自动进行分类,以决定能否贷款? ...
- 决策树笔记:使用ID3算法
决策树笔记:使用ID3算法 决策树笔记:使用ID3算法 机器学习 先说一个偶然的想法:同样的一堆节点构成的二叉树,平衡树和非平衡树的区别,可以认为是"是否按照重要度逐渐降低"的顺序 ...
随机推荐
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- Spring注解
AccountController .java Java代码 1. /** 2. * 2010-1-23 3. */ 4. packag ...
- 数据库设计中的Soft Delete模式
最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
- 从Java文件到字节码文件
本文涉及的javac编译器来自openjdk. javac的目录地址为:解压目录/langtools/src/share/classes/com/sun/tools/javac/ javac编译器将J ...
- CSharpGL(11)用C#直接编写GLSL程序
CSharpGL(11)用C#直接编写GLSL程序 +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharp ...
- Java回调方法详解
回调在维基百科中定义为: 在计算机程序设计中,回调函数,是指通过函数参数传递到其他代码的,某一块可执行代码的引用. 其目的是允许底层代码调用在高层定义的子程序. 举个例子可能更明白一些:以Androi ...
- Atitit rss没落以及替代品在线阅读器
Atitit rss没落以及替代品在线阅读器 1.1. 对RSS的疯狂追逐,在2005年达到了一个高峰.1 1.2. Rss的问题,支持支rss,不支持url1 1.3. ,博客受到社交网络的冲击.s ...
- XSS原理
跨站脚本攻击(Cross-Site Scripting),是一种网站应用程序的安全漏洞,是代码注入攻击的一种. XSS的种类: 反射型XSS: 非持久型XSS(需要自行触发,输入-输出). ...
- 【Win 10 应用开发】手写识别
记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...