机器学习之决策树熵信息增量求解算法实现

此文不对理论做相关阐述,仅涉及代码实现:

1.熵计算公式:

             P为正例,Q为反例

     Entropy(S)   = -PLog2(P) - QLog2(Q);

2.信息增量计算:

    Gain(S,Sv) = Entropy(S) - (|Sv|/|S|)ΣEntropy(Sv);

 

举例:

转化数据输入:

 5  14Outlook       Sunny  Sunny  Overcast  Rain  Rain    Rain    Overcast  Sunny  Sunny    Rain    Sunny   Overcast   Overcast    RainTemperature   Hot    Hot    Hot       Mild  Cool    Cool        Cool   Mild  Cool     Mild    Mild    Mild       Hot         MildHumidity      High   High   High      High  Normal  Normal  Normal     High  Normal   Normal  Normal  High       Normal      HighWind          Weak   Strong Weak      Weak  Weak    Strong  Strong    Weak   Weak     Weak    Strong  Strong     Weak        StrongPlayTennis    No     No     Yes       Yes   Yes     No      Yes       No     Yes      Yes     Yes     Yes        Yes         NoOutlook Temperature Humidity Wind PlayTennis

 

 1 package com.qunar.data.tree;
 2 
 3 /**
 4  * *********************************************************
 5  * <p/>
 6  * Author:     XiJun.Gong
 7  * Date:       2016-09-02 15:28
 8  * Version:    default 1.0.0
 9  * Class description:
10  * <p>统计该类型出现的次数</p>
11  * <p/>
12  * *********************************************************
13  */
14 public class CountMap<T> {
15 
16     private T key;     //类型
17     private int value;   //出现的次数
18 
19     public CountMap() {
20         this(null, 0);
21     }
22 
23     public CountMap(T key, int value) {
24         this.key = key;
25         this.value = value;
26     }
27 
28     public T getKey() {
29         return key;
30     }
31 
32     public void setKey(T key) {
33         this.key = key;
34     }
35 
36     public int getValue() {
37         return value;
38     }
39 
40     public void setValue(int value) {
41         this.value = value;
42     }
43 }
View Code
  1 package com.qunar.data.tree;
  2 
  3 import com.google.common.collect.ArrayListMultimap;
  4 import com.google.common.collect.Maps;
  5 import com.google.common.collect.Multimap;
  6 import com.google.common.collect.Sets;
  7 
  8 import java.util.*;
  9 
 10 /**
 11  * *********************************************************
 12  * <p/>
 13  * Author:     XiJun.Gong
 14  * Date:       2016-09-02 14:24
 15  * Version:    default 1.0.0
 16  * Class description:
 17  * <p>决策树</p>
 18  * <p/>
 19  * *********************************************************
 20  */
 21 
 22 public class DecisionTree<T, K> {
 23 
 24     private static String positiveExampleType = "Yes";
 25     private static String counterExampleType = "No";
 26 
 27 
 28     public double pLog2(final double p) {
 29         if (0 == p) return 0;
 30         return p * (Math.log(p) / Math.log(2));
 31     }
 32 
 33     /**
 34      * 熵计算
 35      *
 36      * @param positiveExample 正例个数
 37      * @param counterExample  反例个数
 38      * @return 熵值
 39      */
 40     public double entropy(final double positiveExample, final double counterExample) {
 41 
 42         double total = positiveExample + counterExample;
 43         double positiveP = positiveExample / total;
 44         double counterP = counterExample / total;
 45         return -1d * (pLog2(positiveP) + pLog2(counterP));
 46     }
 47 
 48     /**
 49      * @param features 特征列表
 50      * @param results  对应结果
 51      * @return 将信息整合成新的格式
 52      */
 53     public Multimap<T, CountMap<K>> merge(final List<T> features, final List<T> results) {
 54         //数据转化
 55         Multimap<T, CountMap<K>> InfoMap = ArrayListMultimap.create();
 56         Iterator result = results.iterator();
 57         for (T feature : features) {
 58             K res = (K) result.next();
 59             boolean tag = false;
 60             Collection<CountMap<K>> countMaps = InfoMap.get(feature);
 61             for (CountMap countMap : countMaps) {
 62                 if (countMap.getKey().equals(res)) {
 63                     /*修改值*/
 64                     int num = countMap.getValue() + 1;
 65                     InfoMap.remove(feature, countMap);
 66                     InfoMap.put(feature, new CountMap<K>(res, num));
 67                     tag = true;
 68                     break;
 69                 }
 70             }
 71             if (!tag)
 72                 InfoMap.put(feature, new CountMap<K>(res, 1));
 73         }
 74 
 75         return InfoMap;
 76     }
 77 
 78     /**
 79      * 信息增益
 80      *
 81      * @param infoMap   因素(Outlook,Temperature,Humidity,Wind)对应的结果
 82      * @param dataTable 输入的数据表
 83      * @param type      因素中的类型(Outlook{Sunny,Overcast,Rain})
 84      * @param entropyS  总的熵值
 85      * @param totalSize 总的样本数
 86      * @return 信息增益
 87      */
 88     public double gain(Multimap<T, CountMap<K>> infoMap,
 89                        Map<K, List<T>> dataTable,
 90                        final String type,
 91                        double entropyS,
 92                        final int totalSize) {
 93         //去重
 94         Set<T> subTypes = Sets.newHashSet();
 95         subTypes.addAll(dataTable.get(type));
 96         /*计算*/
 97         for (T subType : subTypes) {
 98             Collection<CountMap<K>> countMaps = infoMap.get(subType);
 99             double subSize = 0;
100             double positiveExample = 0;
101             double counterExample = 0;
102             for (CountMap<K> countMap : countMaps) {
103                 subSize += countMap.getValue();
104                 if (positiveExampleType.equals(countMap.getKey()))
105                     positiveExample = countMap.getValue();
106                 else
107                     counterExample = countMap.getValue();
108             }
109             entropyS -= (subSize / totalSize) * entropy(positiveExample, counterExample);
110         }
111         return entropyS;
112     }
113 
114     /**
115      * 计算
116      *
117      * @param dataTable  数据表
118      * @param types      因素列表{Outlook,Temperature,Humidity,Wind}
119      * @param resultType 结果(PlayTennis)
120      * @return 返回信息增益集合
121      */
122     public Map<String, Double> calculate(Map<K, List<T>> dataTable, List<K> types, K resultType) {
123 
124         Map<String, Double> answer = Maps.newHashMap();
125         List<T> results = dataTable.get(resultType);
126         int totalSize = results.size();
127         int positiveExample = 0;
128         int counterExample = 0;
129         double entropyS = 0d;
130         for (T ExampleType : results) {
131             if (positiveExampleType.equals(ExampleType)) {
132                 ++positiveExample;
133                 continue;
134             }
135             ++counterExample;
136         }
137         /*计算总的熵*/
138         entropyS = entropy(positiveExample, counterExample);
139 
140         Multimap<T, CountMap<K>> infoMap;
141         for (K type : types) {
142             infoMap = merge(dataTable.get(type), results);
143             double _gain = gain(infoMap, dataTable, (String) type, entropyS, totalSize);
144             answer.put((String) type, _gain);
145         }
146         return answer;
147     }
148 
149 }   1package com.qunar.data.tree;
 2 
 3 import com.google.common.collect.Lists;
 4 import com.google.common.collect.Maps;
 5 
 6 import java.util.*;
 7 
 8 /**
 9  * *********************************************************
10  * <p/>
11  * Author:     XiJun.Gong
12  * Date:       2016-09-02 16:43
13  * Version:    default 1.0.0
14  * Class description:
15  * <p/>
16  * *********************************************************
17  */
18 public class Main {
19 
20     public static void main(String args[]) {
21 
22         Scanner scanner = new Scanner(System.in);
23         while (scanner.hasNext()) {
24             DecisionTree<String, String> dt = new DecisionTree();
25             Map<String, List<String>> dataTable = Maps.newHashMap();
26             /*Map<String, List<String>> dataTable = Maps.newHashMap();*/
27             List<String> types = Lists.newArrayList();
28             String resultType;
29             int factorSize = scanner.nextInt();
30             int demoSize = scanner.nextInt();
31             String type;
32 
33             for (int i = 0; i < factorSize; i++) {
34                 List<String> demos = Lists.newArrayList();
35                 type = scanner.next();
36                 for (int j = 0; j < demoSize; j++) {
37                     demos.add(scanner.next());
38                 }
39                 dataTable.put(type, demos);
40             }
41             for (int i = 1; i < factorSize; i++) {
42                 types.add(scanner.next());
43             }
44             resultType = scanner.next();
45             Map<String, Double> ans = dt.calculate(dataTable, types, resultType);
46             List<Map.Entry<String, Double>> list = new ArrayList<Map.Entry<String, Double>>(ans.entrySet());
47             Collections.sort(list, new Comparator<Map.Entry<String, Double>>() {
48 
49 
50                 @Override
51                 public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
52                     return (o2.getValue() > o1.getValue() ? 1 : -1);
53                 }
54             });
55 
56             for (Map.Entry<String, Double> iterator : list) {
57                 System.out.println(iterator.getKey() + "= " + iterator.getValue());
58             }
59         }
60     }
61 
62 }
63 /**
64  *使用举例:*
65  5  14
66  Outlook       Sunny  Sunny  Overcast  Rain  Rain    Rain    Overcast  Sunny  Sunny    Rain    Sunny   Overcast   Overcast    Rain
67  Temperature   Hot    Hot    Hot       Mild  Cool    Cool        Cool   Mild  Cool     Mild    Mild    Mild       Hot         Mild
68  Humidity      High   High   High      High  Normal  Normal  Normal     High  Normal   Normal  Normal  High       Normal      High
69  Wind          Weak   Strong Weak      Weak  Weak    Strong  Strong    Weak   Weak     Weak    Strong  Strong     Weak        Strong
70  PlayTennis    No     No     Yes       Yes   Yes     No      Yes       No     Yes      Yes     Yes     Yes        Yes         No
71  Outlook Temperature Humidity Wind PlayTennis
72  */

结果:

Outlook= 0.2467498197744391
Humidity= 0.15183550136234136
Wind= 0.04812703040826927
Temperature= 0.029222565658954647

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos6.4下安装jdk

centos安装好后一般默认安装好了openJDK&#xff0c;且在6.4版本下是jdk7&#xff0c;我们要将其卸载在安装jdk6 1.卸载默认安装好的jdk&#xff0c;按下图所示的命令行命令卸载jdk 2.将jdk安装包上传到/usr/local目录下(将jdk其安装到这个目录下&#xff0c;可用winSCP工具上传…

java之socket编程

一&#xff0c;网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机&#xff0c;另一个就是找到主机后如何可靠高效的进行数据传输。 在TCP/IP协议中IP层主要负责网络主机的定位&#xff0c;数据传输的路由&#xff0c;由IP地址可以唯一地确定Internet上的一…

实践剖析.NET Core如何支持Cookie滑动过期和JWT混合认证、授权

【导读】为防止JWT Token被窃取&#xff0c;我们将Token置于Cookie中&#xff0c;但若与第三方对接&#xff0c;调用我方接口进行认证、授权此时仍需将Token置于请求头&#xff0c;通过实践并联系理论&#xff0c;我们继续开始整活首先我们实现Cookie认证&#xff0c;然后再次引…

python基础ppt_Python基础课件.ppt

Python基础课件.ppt 6.10 问题解答 &#xff08;1&#xff09;能不能像执行.exe文件那样执行.py文件呢&#xff1f; 在Windows上是不行的&#xff0c;但是&#xff0c;在Mac和Linux上是可以的&#xff0c;方法是在.py文件的第一行加上一个特殊的注释。 &#xff08;2&#xff0…

导入BaiduMapSdkDemo报230错误解决思路

百度地图官网教程&#xff0c;官方论坛的指导文章都指引读者去使用默认的.android目录下的debug.keystore。然而却在官方的Demo中使用app根目录下的debug.keystore导致简单的错误一直迷路&#xff0c;记录一下自己的解决问题的思路。这其中暴露了我容易走弯路&#xff0c;并且容…

简单音乐播放实例的实现,Android Service AIDL 远程调用服务

2019独角兽企业重金招聘Python工程师标准>>> Android Service是分为两种&#xff1a; 本地服务&#xff08;Local Service&#xff09;&#xff1a; 同一个apk内被调用 远程服务&#xff08;Remote Service&#xff09;&#xff1a;被另一个apk调用 远程服务需要借…

C# 使用int.TryParse,Convert.ToInt32,(int)将浮点类型转换整数时的区别

int.TryParse,Convert.ToInt32,(int) 这几种类型在将浮点类型转换整数时是有差别Convert.ToInt32则会进行四舍五入int.TryParse只能转换整数,即浮点类型全部会返回0(int)不会进行四舍五入,只取整数部分,小数点部分完全舍弃using System;public class DoubleToInt{public …

每个女孩子起床后做的第一件事......

1 假如你暴富了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 当客服到底有多难&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 挺好的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 每个女孩子起床后做的第一件事&#xff…

java之InetAddress类和InetSocketAddress的使用

一、简介 InetAddress是Java对IP地址的封装&#xff0c;代表互联网协议&#xff08;IP&#xff09;地址&#xff1b;InetAddress对象的获取只能通过静态方法&#xff0c;比如根据主机名获取主机的ip地址封装对象&#xff1a; InetAddress addInetAddress.getByName("BOPZ…

国产知名老牌 PDF 工具正式开源

文 | Travis出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;「PDF 补丁丁」是开发者 wmjordan 所开发的一款适用于 Windows 系统的多功能 PDF 文档工具箱&#xff0c;开发者最早于 2009 年开始了该程序的开发&#xff0c;如今已有十二年历史&#xff0c;…

.net Repeater知识知多少

&#xff08;一&#xff09;.net中使用Repeater绑定数据&#xff0c;并使用repeater循环出的两个值&#xff0c;赋给repeater中的div的value值。详细如下&#xff1a; 前端.net代码&#xff1a; <div class"wytz_xmlb_nr clear"><asp:Repeater ID"RpBi…

Centos Missing Library: QtWebKit.so.4

/*********************************************************************   Centos Missing Library: QtWebKit.so.4* 说明&#xff1a;* 这是测试在Centos上运行烧机程序时遇到的问题&#xff0c;记录一下解决办法。* * 2016-9…

目瞪口呆!137亿年的宇宙演化,竟然如此震撼!简直颠覆想象....

▲ 点击查看1968年圣诞节&#xff0c;阿波罗8号在环月球轨道上拍摄了一张照片。这是地球拥有的第一张自拍。也让人类第一次感受到&#xff0c;原来在广阔无垠的宇宙中&#xff0c;地球不过是一个美丽而又珍贵的孤岛。1990年&#xff0c;旅行者1号完成了所有的观测使命&#xff…

python数字从大到小排列_Python练习题 005:三个数字由大到小排序输出

【Python练习题 005】输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 ----------------------------------------------------------------------- 这题想想应该比较容易&#xff1a;无非是先获取3个数字&#xff0c;然后比大小&#xff0c;按顺序输出即可。不过在写…

Android之运行的错误:java.lang.UnsatisfiedLinkError: Couldn‘t find cibloger.so

原因&#xff1a; 因为没有找到相遇的so文件 解决办法&#xff1a; 在eclipse里面的lib文件夹里面的armeabi文件夹加上相应的so文件就可以了

Martin Fowler:数字化时代,远程与本地协同工作孰优孰劣?| IDCF

作者&#xff1a;Martin Fowler译者&#xff1a;冬哥原文&#xff1a;https://martinfowler.com/articles/remote-or-co-located.html远程工作与同地工作之间不是简单的二分法&#xff0c;相反&#xff0c;团队有多种分布模式&#xff0c;每种模式都有不同的权衡和适合的有效技…

android:自己实现能播放网络视频url的播放器

2019独角兽企业重金招聘Python工程师标准>>> android原生自带的播放器一般只能播放本地视频&#xff0c;而没有播放url的功能。不过android系统中有一个VideoView的控件可以实现这一功能。 简单实现如下&#xff1a; public class MyVideoPlay extends Activity i…

Ant 学习

到了新公司&#xff0c;发现公司使用ant 来代码生成。本来学习后写下来。在网上找到一篇教程&#xff0c;实在是非常给力。。。 就把连接记下来吧&#xff1a;http://www.blogjava.net/amigoxie/archive/2007/11/09/159413.html 可以一起学习。转载于:https://www.cnblogs.com/…

iOS调用系统相册、相机 显示中文标题

2019独角兽企业重金招聘Python工程师标准>>> 最终在info.plist设置解决问题 发现在项目的info.plist里面添加Localized resources can be mixed 设置为&#xff1a; YES&#xff08;表示是否允许应用程序获取框架库内语言&#xff09;即可解决这个问题。 转载于:htt…