ID3 决策树

西瓜数据集D如下:

编号 色泽 根蒂 敲声 纹理 脐部 触感 好瓜
1 青绿 蜷缩 浊响 清晰 凹陷 硬滑
2 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑
3 乌黑 蜷缩 浊响 清晰 凹陷 硬滑
4 青绿 蜷缩 沉闷 清晰 凹陷 硬滑
5 浅白 蜷缩 浊响 清晰 凹陷 硬滑
6 青绿 稍蜷 浊响 清晰 稍凹 软粘
7 乌黑 稍蜷 浊响 稍糊 稍凹 软粘
8 乌黑 稍蜷 浊响 清晰 稍凹 硬滑
9 乌黑 稍蜷 沉闷 稍糊 稍凹 硬滑
10 青绿 硬挺 清脆 清晰 平坦 软粘
11 浅白 硬挺 清脆 模糊 平坦 硬滑
12 浅白 蜷缩 浊响 模糊 平坦 软粘
13 青绿 稍蜷 浊响 稍糊 凹陷 硬滑
14 浅白 稍蜷 沉闷 稍糊 凹陷 硬滑
15 乌黑 稍蜷 浊响 清晰 稍凹 软粘
16 浅白 蜷缩 浊响 模糊 平坦 硬滑
17 青绿 蜷缩 沉闷 稍糊 稍凹 硬滑

即集合D为分类问题,分类瓜的好坏是一个二分类问题,故|y| =2 ,故只存在p1,p2

信息熵为衡量信息混乱程度的量

记好瓜比例为p1,坏瓜比例为p2

  1. 若全是好瓜 , 则 p 1 = 1 , p 2 = 0 E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k = − ( p 1 l o g 2 p 1 + p 2 l o g 2 p 2 ) = 1 ⋅ l o g 2 ⋅ 1 + 0 ⋅ l o g 2 ⋅ 0 = 0 2. 若全是好瓜 , 则 p 1 = 0 , p 2 = 1 E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k = − ( p 1 l o g 2 p 1 + p 2 l o g 2 p 2 ) = 0 ⋅ l o g 2 ⋅ 0 + 1 ⋅ l o g 2 ⋅ 1 = 0 则完全不混乱为全是好瓜或全是坏瓜 , E n t ( D ) = 0 2. 若全是好坏瓜个一半 , 则 p 1 = 1 2 , p 2 = 1 2 E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k = − ( p 1 l o g 2 p 1 + p 2 l o g 2 p 2 ) = − ( 1 2 ⋅ l o g 2 ⋅ 1 2 + 1 2 ⋅ l o g 2 ⋅ 1 2 ) = 1 则最混乱为 E n t ( D ) = 1 1.若全是好瓜,则p_1=1,p_2=0 \\ Ent(D) = -\sum\limits _{k=1}^{|y|}p_klog_2p_k \\= -(p_1log_2p_1 + p_2log_2p_2 ) \\=1\cdot log_2\cdot 1 + 0\cdot log_2\cdot 0 \\=0\\ 2.若全是好瓜,则p_1=0,p_2=1 \\ Ent(D) = -\sum\limits _{k=1}^{|y|}p_klog_2p_k \\= -(p_1log_2p_1 + p_2log_2p_2 ) \\=0\cdot log_2\cdot 0 + 1\cdot log_2\cdot 1 \\=0\\ 则完全不混乱为全是好瓜或全是坏瓜,Ent(D) = 0\\ 2.若全是好坏瓜个一半,则p_1=\frac12,p_2=\frac12 \\ Ent(D) = -\sum\limits _{k=1}^{|y|}p_klog_2p_k \\= -(p_1log_2p_1 + p_2log_2p_2 ) \\=-(\frac12\cdot log_2\cdot \frac12 + \frac12\cdot log_2\cdot \frac12 )\\=1\\ 则最混乱为Ent(D) = 1 1.若全是好瓜,则p1=1,p2=0Ent(D)=−k=1∑∣y∣pklog2pk=−(p1log2p1+p2log2p2)=1⋅log2⋅1+0⋅log2⋅0=02.若全是好瓜,则p1=0,p2=1Ent(D)=−k=1∑∣y∣pklog2pk=−(p1log2p1+p2log2p2)=0⋅log2⋅0+1⋅log2⋅1=0则完全不混乱为全是好瓜或全是坏瓜,Ent(D)=02.若全是好坏瓜个一半,则p1=21,p2=21Ent(D)=−k=1∑∣y∣pklog2pk=−(p1log2p1+p2log2p2)=−(21⋅log2⋅21+21⋅log2⋅21)=1则最混乱为Ent(D)=1

当前样本集合D中第k类样本所占比例为pk(k=1,2,3,...,|y|),则D的信息熵为:

E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D) = -\sum\limits _{k=1}^{|y|}p_klog_2p_k Ent(D)=−k=1∑∣y∣pklog2pk

信息增益为:

G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D) - \sum\limits _{v=1}^V \frac{|Dv|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)

python 复制代码
import math
D = [
['青绿','蜷缩','浊响','清晰','凹陷','硬滑','是'],
['乌黑','蜷缩','沉闷','清晰','凹陷','硬滑','是'],
['乌黑','蜷缩','浊响','清晰','凹陷','硬滑','是'],
['青绿','蜷缩','沉闷','清晰','凹陷','硬滑','是'],
['浅白','蜷缩','浊响','清晰','凹陷','硬滑','是'],
['青绿','稍蜷','浊响','清晰','稍凹','软粘','是'],
['乌黑','稍蜷','浊响','稍糊','稍凹','软粘','是'],
['乌黑','稍蜷','浊响','清晰','稍凹','硬滑','是'],
['乌黑','稍蜷','沉闷','稍糊','稍凹','硬滑','否'],
['青绿','硬挺','清脆','清晰','平坦','软粘','否'],
['浅白','硬挺','清脆','模糊','平坦','硬滑','否'],
['浅白','蜷缩','浊响','模糊','平坦','软粘','否'],
['青绿','稍蜷','浊响','稍糊','凹陷','硬滑','否'],
['浅白','稍蜷','沉闷','稍糊','凹陷','硬滑','否'],
['乌黑','稍蜷','浊响','清晰','稍凹','软粘','否'],
['浅白','蜷缩','浊响','模糊','平坦','硬滑','否'],
['青绿','蜷缩','沉闷','稍糊','稍凹','硬滑','否']
]
A = ['色泽','根蒂','敲声','纹理','脐部','触感','好瓜']

# 当前样本集合D中第k类样本所占比例为pk(k=1,2,3,...,|y|)
# 计算A的信息熵,以数据最后一列为分类
def getEnt(D):
    # 获取一个类型k->出现次数的map
    kMap = dict()
    for dLine in D:
        # 获取分类值k
        k = dLine[len(dLine) - 1]
        # 获取当前k出现的次数
        kNum = kMap.get(k)
        if  kNum is None:
            kMap[k] = 1
        else:
            kMap[k] = kNum + 1
    # 遍历map
    dLen = len(D)
    rs = 0
    for kk in kMap:
        pk = kMap[kk]/dLen
        rs = rs + pk * math.log2(pk)
    return -rs


# 求信息增益,aIndex为属性列号
def getGain(D,aIndex):
    dMap = dict()
    for dLine in D:
        # 获取属性
        k = dLine[aIndex]
        # 属性所属的数组
        dChildren = dMap.get(k)
        if  dChildren is None:
            dChildren = []
            dMap[k] = dChildren
        dChildren.append(dLine)
    rs = 0    
    for key in dMap:
        dChildren = dMap[key]
        entx = getEnt(dChildren)
        print(entx)
        r = len(dChildren)/len(D) * entx
        rs = rs + r
    return getEnt(D) - rs
相关推荐
贾全15 分钟前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人
GIS小天30 分钟前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票
我是小哪吒2.041 分钟前
书籍推荐-《对抗机器学习:攻击面、防御机制与人工智能中的学习理论》
人工智能·深度学习·学习·机器学习·ai·语言模型·大模型
慕婉03071 小时前
深度学习前置知识全面解析:从机器学习到深度学习的进阶之路
人工智能·深度学习·机器学习
满分观察网友z1 小时前
开发者的“右”眼:一个树问题如何拯救我的UI设计(199. 二叉树的右视图)
算法
蓝婷儿2 小时前
Python 机器学习核心入门与实战进阶 Day 2 - KNN(K-近邻算法)分类实战与调参
python·机器学习·近邻算法
森焱森2 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天2 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
闪电麦坤953 小时前
数据结构:二维数组(2D Arrays)
数据结构·算法
凌肖战3 小时前
力扣网C语言编程题:快慢指针来解决 “寻找重复数”
c语言·算法·leetcode