这里就不描述ID3算法了。
关于如何使用java实现,其实网上也不少,只是感觉没有拿来就直接能用的,而且,就我搜索到的实现,并没有能够将属性值以及最后的结果加入进来。
算是一个小小的加强版吧。
整个项目已经上传上来了。 项目截图如下:
值得说的有几个地方:
1. 从arff之中解析出属性
public static final String ATTR_PARSE_PATTERN = "@attribute(.*)[{](.*?)[}]";
使用的是正则来进行解析的。这样的解析方式 无法解析数字类型的属性, 比如 属性为numeric or Real的时候就不行了~
2. 就我学到的ID3, 熵的计算只有两个计算因子,即 p+ 跟 p-
我看到有的文章说 熵的计算可以是 p1 p2 ... pn 感觉很奇怪。 因为类似的公式计算出来的熵值居然>1 !
我计算熵值的代码如下:
public static double entropy(int positiveCount, int negativeCount) { int sum = positiveCount + negativeCount; double positiveP = (double)positiveCount / (double)sum ; double negativeP = (double)negativeCount / (double)sum; return Math.abs(positiveP * log2(positiveP) + negativeP * log2(negativeP) ); }
3. 最后解释一下运行的结果:(数据来源是weka自带的weather.arff)
{ "attribute": "outlook", "options": { "rainy": { "attribute": "windy", "options": { }, "subLeafs": { "FALSE": { "count": 3, "attributeValue": "yes", "option": "FALSE" }, "TRUE": { "count": 2, "attributeValue": "no", "option": "TRUE" } } }, "sunny": { "attribute": "humidity", "options": { }, "subLeafs": { "normal": { "count": 2, "attributeValue": "yes", "option": "normal" }, "high": { "count": 3, "attributeValue": "no", "option": "high" } } } }, "subLeafs": { "overcast": { "count": 4, "attributeValue": "yes", "option": "overcast" } } }
attribute是属性的名字,option表示这个属性的分支条件,比如
attribute = outlook, option = rainy 这个分支对应的属性应该是 windy
每个树节点(TreeNode)下都应该跟至少一个叶子节点TreeLeaf 表示这条分支的结束
写了好几个小时终于写出来了。。。 就是现在还不能图形化的显示。。。
[2014-02-15] 增加了一个预测方法:
/** * 使用决策树进行预测 * @param dataSource <br> * HashMap: <br> * key: attribute name * value: attribute value * @param decistionTree * @return <br> * 预测结果 */ public String predict(Map<String, String> dataSource, TreeNode decistionTree) { String result = null; if(dataSource.containsKey(decistionTree.attribute)) { String currentAttributeValue = dataSource.get(decistionTree.attribute); if(decistionTree.options.containsKey(currentAttributeValue)) { return predict(dataSource, decistionTree.options.get(currentAttributeValue)); } else if(decistionTree.subLeafs.containsKey(currentAttributeValue)){ result = decistionTree.subLeafs.get(currentAttributeValue).attributeValue; } } return result; }
PS: 写得不够规范吧,当前目标是能写得出来 写得不好的地方还请各位看官指正
相关推荐
使用java语言实现,ID3算法
用 Java实现经典ID3算法,结果通过控制台直接打印,可自己画UI显示
用Java写的决策树ID3算法,训练集和测试数据都是用的米歇尔的《机器学习》中的例子。
java实现决策树ID3算法 文件读取 有详细的注释
ID3算法java实现类,包含测试数据,训练数据,构造决策树完整的实现
这个例子来源于Quinlan的论文。 假设,有种户外活动。该活动能否正常进行与各种天气因素有关。不同的天气因素组合会产生两种后果,也就是分成2类:能进行活动或不能。我们用P表示该活动可以进行,N表示该活动无法...
详细描述了ID3算法的Java实现,代码清晰,含有注释
决策树ID3算法的Java实现111111111111111111111111111111111111111111111111111111
在NetBeans平台下使用Java实现的ID3决策树分类算法,附带标准测试数据集。
本实验使用的编程语言为:Java 编程环境为:Intellij idea 实现频繁项集的挖掘算法为Apriori算法 用于挖掘的样本个数为:1000个(retail.txt的前1000条数据) 样本示例: { 38,39,47,48} 表示一个顾客购买了ID为38、...
决策树算法ID3算法的java实现,文本文档存储生成决策树需要的学习数据,xml文件存储生成的决策树,注释清楚
java实现ID3算法,包括InFile.java 、 TreeNode.java 、Gain.java、 DecisionTree.java、 id3.java等
<原创>java实现的ID3决策树算法改良版,可以随意改变数据源(符合格式就行)
ID3算法是由Quinlan首先提出的。该算法是以信息论为基础,以信息熵和信息增益度为衡量标准,从而实现对数据的归纳分类。
twitter雪花算法的java实现,分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用...
ID3算法是由Quinlan首先提出的。该算法是以信息论为基础,以信息熵和信息增益度为衡量标准,从而实现对数据的归纳分类。本算法用于实现生物信息的筛选,java实现
id3算法在数据挖掘中用于决策树分析的重要算法,其算法用Java实现,代码如下
决策树算法的java实现,包括C4.5和ID3的实现。
实验内容 已知:UCI标准数据集Car-Evaluation,定义了汽车性价比的4 个类别; 求:用ID3算法建立Car-Evaluation的属性描述决策树