资源简介

决策树生成算法的Java实现,可能还有一些BUG,没有做仔细校验与测试,完成主要功能。决策树具体详解移步:http://blog.csdn.net/adiaixin123456/article/details/50573849 项目的目录结构分为四个文件夹algorithm,common,data,test (1)algorithm为算法,包括DecisionTree(决策树生成算法)、IAttrSelector(最佳分裂点属性选择算法接口)、BaseAttrSelector(基础的属性选择算法实现) (2)common为公用类,只包含了表示多叉树的类TreeNode (3)data为数据,包含了BaseRecord(基础记录,这里只有一个属性,就是要分类的属性Boolean的,其他数据库实体都应该继承该类) HummanAttrRecord(描述用户的属性类,包括收入、年龄、是否为学生、信用评级)、 EmAgeLevel(年龄枚举类)、EmCreditRate(信用枚举类)、EmIncome(收入枚举类)。 (4)test为测试类

资源截图

代码片段和文件信息

package com.adi.datamining.algorithm;

import com.adi.datamining.data.baseRecord;

import java.lang.reflect.Field;
import java.util.*;

/**
 * Created by wudi10 on 2016/1/23.
 */
public class baseAttrSelector implements IAttrSelector{
    /**通过记录集合与记录的属性集合,挑选出属性中增益度最大的属性*/
    @Override
    public Field select(ListseRecord> records Set atrrs){
        Field bestField = null;
        Double highestScore = 0D;
        Double setInfo = entropy(records);
        for(Field field : atrrs) {
            Double gainScore = setInfo - infoScore( records field);
                if(gainScore > highestScore) {
                highestScore = gainScore;
                bestField = field;
            }
        }
        return bestField;
    }
    /**根据记录列表求关于所求类的熵,此方法中要分的类是DcisionAtrr*/
    private Double entropy(ListseRecord> records) {
        Double positCount = 0D;
        Double negatCount = 0D;
        for(baseRecord record : records) {
            if(record.getDecisionAttr())
                ++positCount;
            else
                ++negatCount;
        }
        return - positCount/records.size()* log2N(positCount / records.size())
                - negatCount/records.size()* log2N(negatCount / records.size());

    }

    /**log2(N) log 以2为底N的对数*/
    private Double log2N(Double d) {
        return Math.log(d) / Math.log(2.0);
    }

    /**求某个属性对于分类DecisionAttr的期望分数,公式见<数据挖掘概念与技术>中决策树那节*/
    private Double infoScore(ListseRecord> records Field field) {
        Double infoScore = 0D;
        try {
            //1.求该属性每个值对于分类的正负样例个数,即有多少是true,多少个false;
            MapjectList> count4Values = new HashMapjectList>();//key:存放该属性不同值value:长度为2,存放该属性值对分类正负样例数
            Integer size = records.size();
            field.setAccessible(true);
            for(baseRecord record : records) {
                object attrValue = field.get(record);
                List countList = count4Values.get(attrValue);
                if(countList == null) {
                    countList = new ArrayList(2);
                    countList.add(00);
                    countList.add(10);
                }
                if(record.getDecisionAttr()){
                    countList.set(0countList.get(0) + 1);
                } else {
                    countList.set(1countList.get(1) + 1);
                }
                count4Values.put(attrValue countList);
            }

            //2.遍历map算出期望值
            for(object key : count4Values.keySet()) {
                List countList = count4Values.get(key);
                double positCount = countList.get(0);
                double negatCount = countList.get(1);
                if(positCount == 0 || negatCount == 0) //对于正负样例个数为0的情况,视为无效,对分类影响最大,分数为0;
                    continue;
                double valueCount = positCount + negatCount;
                infoScore += 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-01-24 18:05  DecisionTree\
     目录           0  2016-01-24 18:05  DecisionTree\src\
     目录           0  2016-01-24 18:04  DecisionTree\src\com\
     目录           0  2016-01-24 18:04  DecisionTree\src\com\adi\
     目录           0  2016-01-24 18:04  DecisionTree\src\com\adi\datamining\
     目录           0  2016-01-24 18:04  DecisionTree\src\com\adi\datamining\algorithm\
     文件        3509  2016-01-24 00:06  DecisionTree\src\com\adi\datamining\algorithm\baseAttrSelector.java
     文件        3476  2016-01-24 15:29  DecisionTree\src\com\adi\datamining\algorithm\DecisionTree.java
     文件         320  2016-01-24 17:47  DecisionTree\src\com\adi\datamining\algorithm\IAttrSelector.java
     目录           0  2016-01-24 18:04  DecisionTree\src\com\adi\datamining\common\
     文件        1148  2016-01-24 17:48  DecisionTree\src\com\adi\datamining\common\TreeNode.java
     目录           0  2016-01-24 18:04  DecisionTree\src\com\adi\datamining\data\
     文件         442  2016-01-23 17:16  DecisionTree\src\com\adi\datamining\data\baseRecord.java
     文件         405  2016-01-23 15:46  DecisionTree\src\com\adi\datamining\data\EmAgeLevel.java
     文件         380  2016-01-23 15:46  DecisionTree\src\com\adi\datamining\data\EmCreditRate.java
     文件         395  2016-01-23 15:46  DecisionTree\src\com\adi\datamining\data\EmIncome.java
     文件        1218  2016-01-24 16:27  DecisionTree\src\com\adi\datamining\data\HumanAttrRecord.java
     目录           0  2016-01-24 18:04  DecisionTree\src\test\
     文件        4240  2016-01-24 17:36  DecisionTree\src\test\Test.java

评论

共有 条评论