决策树(2)

package TreeStructure;

import java.util.ArrayList;
import java.util.List;

public class testClass {
    public static void main(String[] args) {
        double [][]exercise = {{1,1,0,0},{1,3,1,1},{3,2,0,0},{3,2,1,10},{3,2,1,10},{3,2,1,10},{2,2,1,1},{3,2,1,9},{2,3,0,1},{2,1,0,0},{3,2,0,1},{2,1,0,1},{1,1,0,1}};
        String []Attribute = {"weather","thin","cloth","target"};
        int []index = {1,0,2,3};
        double [][]exerciseData = new double[exercise.length][];
        for(int i = 0;i<exerciseData.length;i++){
            exerciseData[i] = new double[exercise[i].length];
            for(int j = 0;j<exerciseData[i].length;j++){
                exerciseData[i][j] = exercise[i][index[j]];
            }
        }

        for(int i = 0;i<exerciseData.length;i++){
            for(int j = 0;j<exerciseData[i].length;j++){
                System.out.print("  "+exerciseData[i][j]);
            }
            System.out.println();
        }

        DecisionTree dt = new DecisionTree();
        List<ArrayList<String>> data = new ArrayList<ArrayList<String>>();
        for(int i=0;i<exerciseData.length;i++){
            ArrayList<String> t = new ArrayList<String>();
            for(int j=0;j<exerciseData[i].length;j++){
                t.add(exerciseData[i][j]+"");
            }
            data.add(t);
        }

        List<String>attribute = new ArrayList<String>();
        for(int k=0;k<Attribute.length;k++){
            attribute.add(Attribute[k]);
        }
        TreeNode n =null;
        TreeNode node = dt.createDT(data,attribute,n);
        double[]dataExercise = {2,3};
        List list = new ArrayList();
        for(int i = 0;i<dataExercise.length;i++){
            list.add(dataExercise[i]);
        }

        node.traverse(list);

        System.out.println();
    }

}
package TreeStructure;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class DecisionTree {

    public TreeNode createDT(List<ArrayList<String>> data,List<String> attributeList,TreeNode node){

        System.out.println("当前的DATA为");
         for(int i=0;i<data.size();i++){
                ArrayList<String> temp = data.get(i);
                for(int j=0;j<temp.size();j++){
                    System.out.print(temp.get(j)+ " ");
                }
                System.out.println();
            }
            System.out.println("---------------------------------");
            System.out.println("当前的ATTR为");
            for(int i=0;i<attributeList.size();i++){
                System.out.print(attributeList.get(i)+ " ");
            }
            System.out.println();
            System.out.println("---------------------------------");
            //String result = InfoGain.IsPure(InfoGain.getTarget(data));
            //System.out.println("***************"+result);

            if(node==null){
                node = new TreeNode();
                node.setAttributeValue("start");
                node.setNodeName("start");

            }

            if(attributeList.size() == 1){

                int num = data.size();
                for(int i = 0;i<num;i++){
                TreeNode leafNode = new TreeNode();
                leafNode.setAttributeValue(data.get(i).get(0));
                leafNode.setNodeName("target");
                node.getChildTreeNode().add(leafNode);
                }
                return node;

            }else{

                System.out.println("选择出的最大增益率属性为: " + attributeList.get(0));
                //node.setAttributeValue(attributeList.get(0));
                List<ArrayList<String>> resultData = null;
                InfoGain gain = new InfoGain(data,attributeList);

                Map<String,Long> attrvalueMap = gain.getAttributeValue(0);

                for(Map.Entry<String, Long> entry : attrvalueMap.entrySet()){
                    resultData = gain.getData4Value(entry.getKey(), 0);
                    TreeNode leafNode = new TreeNode();
                    leafNode.setAttributeValue(entry.getKey());
                    leafNode.setNodeName(attributeList.get(0));

                    node.getChildTreeNode().add(leafNode);

                    System.out.println("当前为"+attributeList.get(0)+"的"+entry.getKey()+"分支。");
                    for (int j = 0; j < resultData.size(); j++) {
                        resultData.get(j).remove(0);
                    }
                    ArrayList<String> resultAttr = new ArrayList<String>(attributeList);
                    resultAttr.remove(0);
                    createDT(resultData,resultAttr,leafNode);
                    }
            }

            return node;
            }
        }
package TreeStructure;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class InfoGain {
    private List<ArrayList<String>> data;
    private List<String> attribute;

public InfoGain(List<ArrayList<String>> data,List<String> attribute){

        this.data = new ArrayList<ArrayList<String>>();
        for(int i=0;i<data.size();i++){
            List<String> temp = data.get(i);
            ArrayList<String> t = new ArrayList<String>();
            for(int j=0;j<temp.size();j++){
                t.add(temp.get(j));
            }
            this.data.add(t);
        }

        this.attribute = new ArrayList<String>();
        for(int k=0;k<attribute.size();k++){
            this.attribute.add(attribute.get(k));
        }
        /*this.data = data;
        this.attribute = attribute;*/
    }
public  Map<String,Long> getAttributeValue(int attributeIndex){

        Map<String,Long> attributeValueMap = new HashMap<String,Long>();
        for(ArrayList<String> note : data){
            String key = note.get(attributeIndex);
            Long value = attributeValueMap.get(key);
            attributeValueMap.put(key, value != null ? ++value :1L);
        }
        return attributeValueMap;

    }

    public List<ArrayList<String>> getData4Value(String attrValue,int attrIndex){

        List<ArrayList<String>> resultData = new ArrayList<ArrayList<String>>();
        Iterator<ArrayList<String>> iterator = data.iterator();
        for(;iterator.hasNext();){
            ArrayList<String> templist = iterator.next();
            if(templist.get(attrIndex).equalsIgnoreCase(attrValue)){
                ArrayList<String> temp = (ArrayList<String>) templist.clone();
                resultData.add(temp);
            }
        }
        return resultData;
    }
public static List<String> getTarget(List<ArrayList<String>> data){

        List<String> list = new ArrayList<String>();
        for(ArrayList<String> temp : data){
            int index = temp.size()-1 ;
            if(index == -1){
                break;
            }
            String value = temp.get(index);
            list.add(value);
        }
        return list;
    }

    //判断当前纯度是否100%
    public static String IsPure(List<String> list){

        return list.get(0);
    }

}
package TreeStructure;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

 class TreeNode{

private String attributeValue;
        private List<TreeNode> childTreeNode;
        private List<String> pathName;
        private String targetFunValue;
        private String nodeName;

        public TreeNode(String nodeName){

            this.nodeName = nodeName;
            this.childTreeNode = new ArrayList<TreeNode>();
            this.pathName = new ArrayList<String>();
        }

        public TreeNode(){
            this.childTreeNode = new ArrayList<TreeNode>();
            this.pathName = new ArrayList<String>();
        }

        public String getAttributeValue() {
            return attributeValue;
        }

        public void setAttributeValue(String attributeValue) {
            this.attributeValue = attributeValue;
        }

        public List<TreeNode> getChildTreeNode() {
            return childTreeNode;
        }

        public void setChildTreeNode(List<TreeNode> childTreeNode) {
            this.childTreeNode = childTreeNode;
        }

        public String getTargetFunValue() {
            return targetFunValue;
        }

        public void setTargetFunValue(String targetFunValue) {
            this.targetFunValue = targetFunValue;
        }

        public String getNodeName() {
            return nodeName;
        }

        public void setNodeName(String nodeName) {
            this.nodeName = nodeName;
        }

        public List<String> getPathName() {
            return pathName;
        }

        public void setPathName(List<String> pathName) {
            this.pathName = pathName;
        }

        public void traverse() {
            System.out.println(this.getNodeName()+":   "+this.getAttributeValue());
            int childNumber = this.childTreeNode.size();
            System.out.println(childNumber);
            for (int i = 0; i < childNumber; i++) {
                TreeNode child = this.childTreeNode.get(i);
                child.traverse();
            }
        }  

        public List getTarget(TreeNode node){
            List a = new ArrayList();;
            int childNum = node.getChildTreeNode().size();
            if(node.childTreeNode.get(0).childTreeNode.size()==0){//表示node孩子的孩子为空,即node下一层为目标层
                for(int i = 0;i<childNum;i++){
                    a.add(node.getChildTreeNode().get(i).getAttributeValue());

                }

            }else{
                for(int i = 0;i<childNum;i++){
                    a.addAll(getTarget(node.getChildTreeNode().get(i)));
                }
            }
            return a;
        }
        public void traverse(List list) {
            if(list.size()==0){
                List target = getTarget(this);
//                int childlistNumber = this.childTreeNode.size();
//                List a = new ArrayList();
//                for(int i = 0;i<childlistNumber;i++){
//                TreeNode child = this.childTreeNode.get(i);
//                a.add(child.getAttributeValue());
//                }
                List b = new ArrayList();
//                Map result = new HashMap();
                for(int i = 0;i<target.size();i++){
                    if(!b.contains(target.get(i))){
                    b.add(target.get(i));
                    }
                }
                int []count = new int [b.size()];
                for(int i = 0;i<b.size();i++){

                    for(int j = 0;j<target.size();j++){
                        if(b.get(i).equals(target.get(j))){
                            count[i] = count[i]+1;
                        }
                    }
                    System.out.println(b.get(i)+"的数量是:   "+count[i]);
                }
                int maxIndex = 0;
                for(int i = 1;i<count.length;i++){
                    if(count[maxIndex]<count[i]){
                        maxIndex = i;
                    }
                }
                System.out.println("选择"+b.get(maxIndex)+"为最终决策");

            }else{
            List a = new ArrayList();
            double temp = (Double)list.get(0);
            int childlistNumber = this.childTreeNode.size();
            System.out.println(childlistNumber);
            for(int i = 0;i<childlistNumber;i++){
                TreeNode child = this.childTreeNode.get(i);
                double tempchild = Double.valueOf(child.getAttributeValue());
                if(temp==tempchild){
                    System.out.println(child.getNodeName()+":   "+child.getAttributeValue());
                    list.remove(0);
                    child.traverse(list);
                }
            }
            }
        }
 }
时间: 2024-12-22 03:55:48

决策树(2)的相关文章

决策树之ID3、C4.5、C5.0 、CART

决策树是一种类似于流程图的树结构,其中,每个内部节点(非树叶节点)表示一个属性上的测试,每个分枝代表该测试的一个输出,而每个树叶节点(或终端节点存放一个类标号).树的最顶层节点是根节点.下图是一个典型的决策树(来自<数据挖掘:概念与技术>[韩家炜](中文第三版)第八章): 在构造决策树时,使用属性选择度量来选择将元祖划分成不同类的属性.这里我们介绍三种常用的属性选择度量-----信息增益.信息增益率和基尼指数.这里使用的符号如下.设数据分区\(D\)为标记类元组的训练集.假设类标号属性具有\(

决策树 随机森林 adaboost

? 熵.互信息? 决策树学习算法 ? 信息增益 ? ID3.C4.5.CART? Bagging与随机森林? 提升 ? Adaboost/GDBT ? 熵.互信息 熵是对平均不确定性的度量. 平均互信息:得知特征Y的信息而使得对标签X的信息的不确定性减少的程度.描述随机变量之间的相似程度.(条件熵.相对熵:差异性) ? 决策树 决策树学习采用的是自顶向下的递归方法,有监督学习. 其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零,此时每个叶节点中的实例都属于同一类. 建立

机器学习中的算法(1)-决策树模型组合之随机森林与GBDT

版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系[email protected] 前言: 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等.但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的. 模型组合(比如

【转载】GBDT(MART) 迭代决策树入门教程 | 简介

      转载地址:http://blog.csdn.net/w28971023/article/details/8240756        GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案.它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法.近些年更因为被用于搜索排

数据挖掘(三)——决策树

一.概念 一张图就可以理解决策树是什么 图中的属性有三种:No Surfacing (水下是否可生存).Filppers(有无脚蹼).Fish(鱼),通常我们通过前两个属性来判断第三个属性,判断到底是不是鱼.所以 第三个属性这里就称它为决策属性 二.构建决策树的基本步骤 1.将所有数据看作是一个节点 2.计算信息熵选择出最好的分割点(如图中的No Surfacing或Filppers) 3.分割数据(假如分成两份数据子集A和B),看数据子集中的决策属性是否相同,相同则不继续分 4.不相同则继续分

3 决策树(一)

3.1  决策树的构造 3.1.1 信息增益 熵(entropy)是信息的期望值.如果待分类的事物可能划分在多个分类中,则符号xi的信息定义为:,p(xi)为该分类的概率. 为了计算熵,需计算所有类别所有可能包含的信息期望值:,n是分类的数目. 3.1.2 划分数据集 分类算法需要:上述的测量信息熵.划分数据集.度量划分数据集的熵. 注意:这里数据集需要满足以下两个办法: <1>所有的列元素都必须具有相同的数据长度 <2>数据的最后一列或者每个实例的最后一个元素是当前实例的类别标签

决策树

什么是决策树 决策树算法的具体描述 常见的决策树算法 算法实现可能遇到的局限性和解决方法 与其他算法比较的优缺点 决策树的例子及常见算法:http://blog.csdn.net/v_july_v/article/details/7577684 决策树过渡拟合解决方法:http://www.cnblogs.com/bourneli/archive/2013/03/15/2961568.html 决策树的算法描述:http://www.cnblogs.com/fengfenggirl/p/clas

决策树ID3算法预测隐形眼睛类型--python实现

本节讲解如何预测患者需要佩戴的隐形眼镜类型. 1.使用决策树预测隐形眼镜类型的一般流程 (1)收集数据:提供的文本文件(数据来源于UCI数据库) (2)准备数据:解析tab键分隔的数据行 (3)分析数据:快速检查数据,确保正确地解析数据内容,使用createPlot()函数绘制最终的树形图 (4)训练算法:createTree()函数 (5)测试算法:编写测试函数验证决策树可以正确分类给定的数据实例 (6)使用算法:存储数的数据结构,以使下次使用时无需重新构造树 trees.py如下: #!/u

【Machine Learn】决策树案例:基于python的商品购买能力预测系统

决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结合视频学习和书籍基础的笔记所得.本系列文章将采用理论结合实践方式编写.首先介绍机器学习和深度学习的范畴,然后介绍关于训练集.测试集等介绍.接着分别介绍机器学习常用算法,分别是监督学习之分类(决策树.临近取样.支持向量机.神经网络算法)监督学习之回归(线性回归.非线性回归)非监督学习(

《机器学习实战》——决策树

原理(ID3): 依次选定每个特征,计算信息增益(基本信息熵-当前信息熵),选择信息增益最大的一个作为最佳特征: 以该特征作为树的根节点,以该最佳特征的每一个值作为分支,建立子树: 重复上述过程,直到:1) 所有类别一致 2) 特征用尽 优点: 简单容易理解: 可处理有缺失值的特征.非数值型数据: 与训练数据拟合很好,复杂度小 缺点: 选择特征时候需要多次扫描与排序,适合常驻内存的小数据集: 容易过拟合: 改进: ID3算法偏向取值较多的特征(宽且浅的树),适合离散型数据,难处理连续型数据.香农