信息熵
信息熵是信息论中用来度量信息含量不确定性的一种指标。简单来说,熵越大,表示信息的不确定性越高,信息量越大;熵越小,表示信息的不确定性越低,信息量越小。
所以,信息熵是大好还是小好,取决于具体的应用场景和需求:
-
数据压缩和编码:在数据压缩和编码领域,我们通常希望信息熵尽可能小,因为这表示数据中的冗余信息少,更容易被压缩。
-
通信:在通信领域,如果信号中的熵太大,可能意味着传输过程中容易出错,因此需要更多的资源来进行错误纠正。而在某些安全通信的场合,高熵可能是期望的,因为它可以提供更高的保密性。
-
密码学:在密码学中,高熵是一个好事情,因为它使得密码更难以被预测和破解。
-
决策和预测 :在决策支持和预测模型中,如果输入数据的熵很高,可能意味着数据包含了大量有用的信息,这对于建立有效的模型是有利的。
-
信息检索:在信息检索领域,希望检索结果具有低熵,即结果尽可能相关和集中,而不是分散和不相关。
因此,信息熵的大小没有绝对的好坏之分,需要根据具体的应用目标和背景来评估。
信息增益率
决策树怎么写
++好抽象的过程++
编写一个生成决策树的算法代码可以从实现一个简单的决策树学习算法开始,比如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_entropy
return 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] = subtree
return 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 np
x = 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
来计算图像中每个灰度值的出现次数。