文章目录

  • 初始化,涉及到使用的变量:
  • 信息熵
    • 定义公式,经验公式
    • 代码:
  • 基尼系数
    • 定义公式,经验公式
    • 代码:
  • 条件熵,条件基尼系数
    • 条件熵定义公式,经验公式
    • 条件基尼系数定义公式,经验公式
    • 代码:
  • 信息增益,信息增益比,基尼增益
    • 信息增益
    • 信息增益比
    • 基尼增益
    • 代码:

初始化,涉及到使用的变量:

# =============================================================================
# 计算信息量的相关算法
# =============================================================================
import math
import numpy as npclass Cluster:def __init__(self,x,y,sample_weight=None,base=2):# 记录数据集的变量为numpy数组self._x,self._y = x.T,y# 利用样本权重对类别向量计数,self._counters样本各个类别的计数if sample_weight is None:self._counters = np.bincount(self._y)else:self._counters = np.bincount(self._y,weights = sample_weight*len(sample_weight))# 记录样本权重的属性self._sample_weight = sample_weight# 记录中间结果的属性self._con_chaos_cache = self._ent_cache = self._gini_cache = None# 记录对数的底的属性self._base = base

信息熵

定义公式,经验公式


代码:

    # 定义计算信息熵的函数,默认计算整个样本信息熵,self._ent_cache就是样本信息熵# 子样本信息熵需要给出每个类别的数量def ent(self,ent=None,eps = 1e-12):# 如果已经计算过,且调用时没有额外给各类别样本的个数,就直接返回调用结果if self._ent_cache is not None and ent is None:return self._ent_cache_len = len(self._y)# 如果没有给出各类别样本的个数,就是用结构本身的计数器来获取相应的个数if ent is None:ent = self._counters# eps使算法的稳定性更好_ent_cache = max(eps,-sum([_c / _len*math.log(_c / _len,self._base) if _c !=0 else 0 for _c in ent]))# 如果调用时没有给出各个类别样本数量,就将计算的信息熵保存下来if ent is None:self._ent_cache = _ent_cachereturn _ent_cache

基尼系数

定义公式,经验公式


代码:

    # 计算基尼系数,p为各个分类数量def gini(self,p=None):if self._gini_cache is not None and p is None:return self._gini_cache_len = len(self._y)# 如果没有给出各类别样本的个数,就是用结构本身的计数器来获取相应的个数if p is None:p = self._counters_gini_cache = 1-np.sum((p/_len)**2)if p is None:self._gini_cache = _gini_cachereturn _gini_cache

条件熵,条件基尼系数

条件熵定义公式,经验公式

条件基尼系数定义公式,经验公式


代码:

# =============================================================================
#     定义计算H(y|A)和 Gini(y|A)
# =============================================================================def con_chaos(self,idx,criterion="ent",features=None):# 根据不同的准则调用不同的方法, lambda input:outputif criterion == "ent":_meghod = lambda Cluster: Cluster.ent()elif criterion == "gini":_meghod = lambda Cluster: Cluster.gini()# 获取相应纬度的向量,也就是feathure A ,是一个[N]的行向量# data为feature = idx的N个数据的feathureValuedata = self._x[idx]# 如果没有给出该feathure的取值空间,就调用set函数自己算出来# 调用set比较耗时,决策实现尽量传入features# features为该feature的取值空间if features is None:features = set(data)# 获取这个feature下的各个featureValue在data中的位置# 返回的是[featureValue,对应的mask]tmp_labels = [data == feature for feature in features]# 在这个函数里没有使用,记录下来后面会用# [featureValue,对应的它的样本数量]self._con_chaos_cache =[np.sum(_label) for _label in tmp_labels]# 利用mask获取每个featureValue对应的y样本# [featureValue,对应他的y样本]label_lst = [self._y[label] for label in tmp_labels]# 上面的操作就是为了获取mask,从而获取:在feature=idx,取m个不同featureValue# 时,这个时候的x样本和y样本,利用这些样本求信息增益的后半部分# 记录H(y|A)最后计算结果rs =0# 记录每一个featureValue对应的信息增益的后半部分,# 也就是条件不确定度,后面决策树生成会用到chaos_lst =[]for data_label,tar_label in zip(tmp_labels,label_lst):# 获取对应的x样本,mask使用条件row=column,所以需要转置,# 匹配的y样本就是tar_label,名字取得有点问题,应该叫tar_datatmp_data = self._x.T[data_label]if self._sample_weight is None:# 恕我直言这个地方没必要用_meghod,有点炫耀技术,应该可以直接调用吧_chaos = _meghod(Cluster(tmp_data,tar_label,base=self._base))else:_new_weights = self._sample_weight[data_label]_chaos = _meghod(Cluster(tmp_data,tar_label,_new_weights/np.sum(_new_weights),base=self._base))# 计算信息增益外面的那个求和,注意负号在里面计算互信息里计算过了# 把m个featureValue遍历完毕,就计算出了H(y|A)rs +=len(tmp_data)/len(data)*_chaos# 记录各部分条件不确定度,后面决策树生成会用到chaos_lst.append(_chaos)return rs,chaos_lst

信息增益,信息增益比,基尼增益

信息增益

信息增益比


HA(y)H_A(y)HA​(y)的定义和经验求法:


可以看出也可以使用熵的函数求解。

基尼增益

代码:

# =============================================================================
#     计算信息增益
# =============================================================================# get_chaos_lst用于控制输出def info_gain(self,idx,criterion="ent",get_chaos_lst=False,features=None):# 依据不同的准则,获取相应的条件不确定度if criterion in ("ent","ratio"):_con_chaos,_chaos_lst =self.con_chaos(idx,"ent",features)_gain = self.ent() - _con_chaos# 我们知道g_ratio(y,A) = g(y,A)/H_A(y)# self._con_chaos_cache :[featureValue,对应的它的样本数量]# H_A(y)如何求?根据他的经验熵公式,只要把[featureValue,对应的它的样本数量]# 带入计算就可以了if criterion == "ratio":_gain /= self.ent(self._con_chaos_cache)elif criterion == "gini":_con_chaos,_chaos_lst =self.con_chaos(idx,"gini",features)_gain = self.gini() - _con_chaosreturn (_gain,_chaos_lst) if get_chaos_lst else _gain

机器学习:信息熵,基尼系数,条件熵,条件基尼系数,信息增益,信息增益比,基尼增益,决策树代码实现(一)相关推荐

  1. AI基础:信息熵、信息增益、信息增益率、基尼指数

    给实习生聊到决策树.GBDT,有几个概念这里再用易懂的方式解释下 文章目录 信息熵 条件熵 信息增益 信息增益率 基尼指数 信息熵是决策树的基础 信息增益-ID3算法构建决策树 信息增益率-C4.5算 ...

  2. 【机器学习】采用信息增益、信息增益率、基尼指数来建造决策树。

    目录 一.创建数据集 二.构造决策树(诊断是否复发乳腺癌) 1.信息增益生成决策树 (ID3算法) 信息熵 信息增益(ID3算法) 2.信息增益率决策树(C4.5) 3.基尼指数(CART算法 - 分 ...

  3. 机器学习基础(五十)—— Gini Impurity(基尼不纯度)与香浓熵(Shannon Entropy))

    基尼不纯度/香浓熵:衡量集合的无序程度: 基尼不纯度 基尼不纯度:将来自集合的某种结果随机应用于某一数据项的预期误差率. IG(f)=∑i=1mfi(1−fi)=∑i=1mfi−∑i=1mf2i=1− ...

  4. 决策树(信息熵、增益率、基尼指数)

    目录 前言 一.决策树是什么? 二.实验过程 1.选择数据集中各个决策属性的优先级 1.1信息熵 1.2增益率 1.3基尼指数 2.决策树的构造 2.1创建决策树: 2.2准备数据: 2.3.读取和保 ...

  5. 决策树 信息熵 条件熵 基尼系数 信息增益 信息增益率 CART 随机森林

    决策树: 决策树是一种树形结构,树内部每个节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶子节点代表一个分类类别.通过训练数据构建决策树,可以对未知数据进行分类, 上面的决策树深度depth ...

  6. 信息熵、条件熵、信息增益、相对熵 、交叉熵 解析

    原文地址:https://www.cnblogs.com/kyrieng/p/8694705.html 1.信息熵 (information entropy) 熵 (entropy) 这一词最初来源于 ...

  7. [机器学习]信息熵信息增益

    关于对信息.熵.信息增益是信息论里的概念,是对数据处理的量化,这几个概念主要是在决策树里用到的概念,因为在利用特征来分类的时候会对特征选取顺序的选择,这几个概念比较抽象,我也花了好长时间去理解(自己认 ...

  8. 通俗理解信息熵、条件熵、信息增益

    转自知乎 https://zhuanlan.zhihu.com/p/26486223 ,https://zhuanlan.zhihu.com/p/26551798 作者:忆臻 主页:https://w ...

  9. 信息熵和条件熵的计算

    目录 1. 信息熵 2. 条件熵 3. 参考文章 表1. 目标值为PlayTennis的14个训练样例 Day Outlook Temperature Humidity Wind PlayTennis ...

最新文章

  1. ExtJS 4.1更新
  2. 学银在线python课程_Python 从入门到精通:一个月就够了!
  3. 【洛谷 1879】玉米田
  4. uboot将命令结构体单独存放在某个代码段的方法
  5. oracle提交数据按键,Oracle PLSQL - 仅提交数据库链接(Oracle PLSQL - Commit only database link)...
  6. QTreeView导航菜单效果
  7. vba代码换行的写法总结
  8. Design Ware IP
  9. MySQL报错: Incorrect string value: '\xE5\x85\xA8\xE7\x90\x83...' for column 'cname' at row 1
  10. IIS启动失败,发生意外错误 0x8ffe2740的解决方法
  11. 新职业人工智能工程师要学哪些内容?
  12. 计算机基础教育对工科学生的意义,深入进行高校工科非计算机专业计算机基础教育改革…...
  13. 为什么那么多的人选择到Java培训机构学习
  14. 今日金融词汇--- 高杠杆模式
  15. UIImage 的图片平铺实现效果
  16. 360和QQ,拿什么来拯救你?
  17. RocketMQ—Producer(三)发送方式和消息类型
  18. mysql数据库问题解答_MySQL数据库常见错误问题解答 - MySQL 教程精选
  19. 在ps怎么临摹做icon
  20. 用计算机名怎么共享电视盒,机顶盒播放电脑视频的方法, 局域网共享教程

热门文章

  1. PHP中文获取拼音函数
  2. html怎么让动画最后消失了,css3 – 不能停止css动画在最后一个关键帧后消失
  3. python时间序列画图_简洁的Python时间序列可视化实现
  4. java字节数_Java各种类型占用的字节数
  5. java创建具体时间点_java单例饿汉模式对象创建时间点疑问
  6. CentOS 安装宋体字体
  7. nginx ruoyi 配置静态资源服务
  8. maven 多模块项目:单独构建某个模块
  9. 操作系统--中断和异常
  10. vue实现查询多条记录_sql:多表查询