《机器学习》第四章信息熵 信息增益率决策树怎么写

devtools/2024/12/23 20:48:03/

信息熵

信息熵是信息论中用来度量信息含量不确定性的一种指标。简单来说,熵越大,表示信息的不确定性越高,信息量越大;熵越小,表示信息的不确定性越低,信息量越小。

所以,信息熵是大好还是小好,取决于具体的应用场景和需求:

  1. 数据压缩和编码:在数据压缩和编码领域,我们通常希望信息熵尽可能小,因为这表示数据中的冗余信息少,更容易被压缩。

  2. 通信:在通信领域,如果信号中的熵太大,可能意味着传输过程中容易出错,因此需要更多的资源来进行错误纠正。而在某些安全通信的场合,高熵可能是期望的,因为它可以提供更高的保密性。

  3. 密码学:在密码学中,高熵是一个好事情,因为它使得密码更难以被预测和破解。

  4. 决策和预测:在决策支持和预测模型中,如果输入数据的熵很高,可能意味着数据包含了大量有用的信息,这对于建立有效的模型是有利的。

  5. 信息检索:在信息检索领域,希望检索结果具有低熵,即结果尽可能相关和集中,而不是分散和不相关。

因此,信息熵的大小没有绝对的好坏之分,需要根据具体的应用目标和背景来评估。

信息增益率 

决策树怎么写

好抽象的过程 

编写一个生成决策树的算法代码可以从实现一个简单的决策树学习算法开始,比如ID3(Iterative Dichotomiser 3)算法。以下是一个使用Python实现的简化版ID3算法的例子。这个例子假设你已经有了数据集,并且数据集是适合用来构建决策树的,即所有特征都是离散的。

python

复制

import numpy as np
from collections import Counter# 计算信息熵
def entropy(subset):# 计算标签的频率label_counts = Counter(subset[:, -1])# 计算熵entropy_value = -sum((count / len(subset)) * np.log2(count / len(subset)) for count in label_counts.values())return entropy_value# 计算信息增益
def information_gain(data, feature_index):# 计算整个数据集的熵total_entropy = entropy(data)# 特征的唯一值及其出现次数feature_values, counts = np.unique(data[:, feature_index], return_counts=True)# 计算特征的加权熵weighted_entropy = sum((count / len(data)) * entropy(data[data[:, feature_index] == value]) for value, count in zip(feature_values, counts))# 计算信息增益gain = total_entropy - weighted_entropyreturn gain# 递归构建决策树
def build_tree(data, features):# 所有样本的标签labels = data[:, -1]# 如果所有标签相同,返回该标签if len(set(labels)) == 1:return labels[0]# 如果没有特征可以分割,返回最频繁的标签if len(features) == 0:return Counter(labels).most_common(1)[0][0]# 选择具有最高信息增益的特征best_feature_index = np.argmax([information_gain(data, feature_index) for feature_index in features])# 创建子节点tree = {features[best_feature_index]: {}}# 移除已选择的特征remaining_features = [feature for feature in features if feature != features[best_feature_index]]# 对于特征的每个唯一值,递归构建子树for value in np.unique(data[:, best_feature_index]):sub_data = data[data[:, best_feature_index] == value]subtree = build_tree(sub_data, remaining_features)tree[features[best_feature_index]][value] = subtreereturn tree# 示例数据集
# 特征:是否晴天、温度、湿度、风况;标签:是否去玩
data = np.array([['Sunny', 'Hot', 'High', 'Weak', 'No'],['Sunny', 'Hot', 'High', 'Strong', 'No'],['Overcast', 'Hot', 'High', 'Weak', 'Yes'],['Rain', 'Mild', 'High', 'Weak', 'Yes'],['Rain', 'Cool', 'Normal', 'Weak', 'Yes'],['Rain', 'Cool', 'Normal', 'Strong', 'No'],['Overcast', 'Cool', 'Normal', 'Strong', 'Yes'],['Sunny', 'Mild', 'High', 'Weak', 'No'],['Sunny', 'Cool', 'Normal', 'Weak', 'Yes'],['Rain', 'Mild', 'Normal', 'Weak', 'Yes'],['Sunny', 'Mild', 'Normal', 'Strong', 'Yes'],['Overcast', 'Mild', 'High', 'Strong', 'Yes'],['Overcast', 'Hot', 'Normal', 'Weak', 'Yes'],['Rain', 'Mild', 'High', 'Strong', 'No'],
])# 特征名称
features = ['Outlook', 'Temperature', 'Humidity', 'Wind']# 构建决策树
decision_tree = build_tree(data, features)# 打印决策树
print(decision_tree)

请注意,上述代码是一个非常简化的决策树实现,它没有处理连续特征、缺失值、剪枝等问题。在实际应用中,通常会使用更复杂的算法和库,如scikit-learn中的DecisionTreeClassifier。这个例子仅用于展示基本的决策树构建流程。在实际使用中,你可能需要根据具体的数据和需求来调整和优化代码。

修改后

结果


IndexError Traceback (most recent call last) Cell In[1], line 70 67 features = [‘Outlook’, ‘Temperature’, ‘Humidity’, ‘Wind’] 69 # 构建决策树 —> 70 decision_tree = build_tree(data, features) 72 # 打印决策树 73 decision_tree

Cell In[1], line 35, in build_tree(data, features) 33 return Counter(labels).most_common(1)[0][0] 34 # 选择具有最高信息增益的特征 —> 35 best_feature_index = np.argmax([information_gain(data, feature_index) for feature_index in features]) 36 # 创建子节点 37 tree = {features[best_feature_index]: {}}

Cell In[1], line 35, in (.0) 33 return Counter(labels).most_common(1)[0][0] 34 # 选择具有最高信息增益的特征 —> 35 best_feature_index = np.argmax([information_gain(data, feature_index) for feature_index in features]) 36 # 创建子节点 37 tree = {features[best_feature_index]: {}}

Cell In[1], line 17, in information_gain(data, feature_index) 15 total_entropy = entropy(data) 16 # 特征的唯一值及其出现次数 —> 17 feature_values, counts = np.unique(data[:, feature_index], return_counts=True) 18 # 计算特征的加权熵 19 weighted_entropy = sum((count / len(data)) * entropy(data[data[:, feature_index] == value]) for value, count in zip(feature_values, counts))

IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices

代码执行时发生了一个错误。这个错误是由于在尝试使用特征名称作为索引来访问数据时,数据集实际上是以数字索引来访问的。为了解决这个问题,我们需要将特征名称映射到相应的数字索引。我将修正这个问题并重新执行代码。

 代码生成:已完成

结果

{‘Outlook’: {‘Overcast’: ‘Yes’, ‘Rain’: {‘Wind’: {‘Strong’: ‘No’, ‘Weak’: ‘Yes’}}, ‘Sunny’: {‘Humidity’: {‘High’: ‘No’, ‘Normal’: ‘Yes’}}}}

引用

这是根据提供的数据集构建的决策树的结果:

复制

{'Outlook': {'Overcast': 'Yes','Rain': {'Wind': {'Strong': 'No','Weak': 'Yes'}},'Sunny': {'Humidity': {'High': 'No','Normal': 'Yes'}}}
}

这个决策树的结构表明:

  • 如果天气是阴天(Overcast),那么决策是去玩(Yes)。
  • 如果天气是雨天(Rain),那么决策取决于风况(Wind):
    • 如果风大(Strong),那么决策是不去玩(No)。
    • 如果风小(Weak),那么决策是去玩(Yes)。
  • 如果天气是晴天(Sunny),那么决策取决于湿度(Humidity):
    • 如果湿度高(High),那么决策是不去玩(No)。
    • 如果湿度正常(Normal),那么决策是去玩(Yes)。

代码赏鉴

很好的参考:决策树原理及手写代码理解_手写决策树推理代码-CSDN博客

難しい*…長い⁂…まだ冬休み**……

新术语

np.bincount

np.bincount 是 NumPy 库中的一个函数,用于计算非负整数的直方图。具体来说,它返回一个数组,其中数组的索引表示输入数组中的值,而对应的元素值表示输入数组中每个值的出现次数。

以下是 np.bincount 的基本用法:

import numpy as npx = np.array([0, 1, 1, 3, 2, 1, 7])
result = np.bincount(x)
print(result)

这段代码会输出 [1 3 1 1 0 0 0 1],这表示:

  • 数字 0 在数组 x 中出现了 1 次,
  • 数字 1 在数组 x 中出现了 3 次,
  • 数字 2 在数组 x 中出现了 1 次,
  • 数字 3 在数组 x 中出现了 1 次,
  • 数字 4、5、6 在数组 x 中没有出现(因此计数为 0),
  • 数字 7 在数组 x 中出现了 1 次。

np.bincount 的几个重要参数包括:

  • x:输入的一维非负整数数组。
  • weights(可选):与 x 相同长度的权重数组,用于给 x 中的每个值指定权重。
  • minlength(可选):输出数组的长度。如果 x 中有比 minlength-1 大的值,那么结果数组在这个索引位置及其之后的值将为 0。

这个函数在处理数据,尤其是需要统计整数出现频率时非常有用。例如,在图像处理中,可以用 np.bincount 来计算图像中每个灰度值的出现次数。


http://www.ppmy.cn/devtools/144788.html

相关文章

【Lua热更新】下篇

上篇链接:【Lua热更新】上篇 文章目录 三、xLua热更新📖1.概述📚︎2.导入xLua框架🔖3. C#调用Lua3.1Lua解析器3.2Lua文件夹的重定向3.3Lua解析器管理器3.4全局变量获取3.5全局函数获取3.6映射到List和Dictionary3.7映射到类3.8映…

如何在谷歌浏览器中开启安全浏览

在数字化时代,网络安全变得愈发重要。作为全球最受欢迎的网络浏览器之一,谷歌浏览器提供了多种功能来保护用户的在线安全。本文将详细介绍如何在谷歌浏览器中开启安全浏览,并额外提供一些有用的页面滚动设置、地址栏快捷搜索和跟踪防护的相关…

中宇联与亚马逊云科技共同推出Well-Architected联合解决方案

数字化转型正如火如荼地进行,云计算已逐渐成为企业发展的核心动力。亚马逊云科技积极承担起数字经济时代基础设施提供者及企业成长的高质量伙伴角色,全心全意深化客户服务,赋能企业迈向成功之路。基于多年服务各行各业客户的经验总结&#xf…

JAVA没有搞头了吗?

前言 今年的Java程序员群体似乎承受着前所未有的焦虑。投递简历无人问津,难得的面试机会也难以把握,即便成功入职,也往往难以长久。于是,不少程序员感叹:互联网的寒冬似乎又一次卷土重来,环境如此恶劣&…

k8s迁移——岁月云实战笔记

新系统使用rockylinux9.5,旧系统虚拟机装的是centos7 1 目标服务器 1.1 禁止swap swapoff -a vi /etc/fstab #/dev/mapper/rl-swap none swap defaults 0 0 #执行,swap一行都是0 free -h 1.2 关闭防火墙 只是为了减…

CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究

论文标题 An Empirical Study of Scaling Law for OCR OCR 缩放定律的实证研究 论文链接: An Empirical Study of Scaling Law for OCR论文下载 论文作者 Miao Rang, Zhenni Bi, Chuanjian Liu, Yunhe Wang, Kai Han 内容简介 本论文在光学字符识别&#xf…

CUDA基础编程:开启深度学习 GPU 加速之门

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 文章有点长(字),期望您能坚…

Vue.js前端框架教程1:Vue应用启动和Vue组件

文章目录 Vue 应用Vue 应用的主要组成部分:启动 Vue 应用:Vue组件基础组件组件注册父子组件组件插槽(Slots)动态组件和 `keep-alive`Vue 应用 Vue 应用由几个主要部分组成,每个部分都有其特定的角色和职责。以下是 Vue 应用的主要组成部分以及如何启动一个 Vue 应用的介绍…