首页 > 其他分享 >香农熵-互信息-entropy

香农熵-互信息-entropy

时间:2024-10-09 17:44:24浏览次数:8  
标签:return 互信息 joint xy entropy 香农 np prob

概念

 信息熵--单个随机变量的信息量
    香农熵又称信息熵,反映了一条信息的信息量大小和它的不确定性之间的关系,是信息量的度量,单位为 bit
 互信息--两个随机变量间相关信息的多少 
 
  互信息不假设数据的分布,可以应用于各种类型的数据。
   依赖样本量:互信息的估计依赖于样本量,样本量不足可能导致估计不准确。
 熵可以用来计算一个系统中的失序现象,即混乱程度 熵、联合熵、条件熵以及互信息之间的关系是
    条件熵(Conditional Entropy)
	联合熵(Joint Entropy) 
 方差度量一个数值集合或数值分布的离散程度。不确定性与离散程度有关
    联合概率是指在概率论中,两个或多个随机变量同时取特定值的概率

步骤

联合熵,需要进行以下步骤:
    确定多个随机变量的取值和概率分布。
    计算每个随机变量的熵。
    计算多个随机变量的条件熵。
    计算联合熵

代码

def counter(list):
	c_dict = {}
	for i in list:
		if i in c_dict:
			c_dict[i] += 1
		else:
			c_dict[i] = 1
	return c_dict
def count_prob(X,Y):
    # 使用字典统计每一个(x,y)元素出现的次数
    d_xy = dict()  # x的字典
    for i in range(X.size):
        if (X[i], Y[i]) in d_xy:
            d_xy[X[i], Y[i]] += 1
        else:
            d_xy[X[i], Y[i]] = 1
    # 计算每个元素出现的概率
    p_xy = dict()
    for xy in d_xy.keys():
        p_xy[xy] = d_xy[xy] / X.size
    return p_xy
    

### ( H(X) ) 是单个变量的熵
def entropy(x):
	counts = counter(x) #每个变量出现的次数
	prob = [i/len(x) for i in counts.values()] # 每个变量发生的概率
	return -sum([p*math.log(p) for p in prob if p > 0 ]) # 计算信息熵
	
def entropy(prob):
    return -np.sum([p * np.log2(p) for p in prob if p > 0])
	
	
import math
def joint_entropy(joint_prob):
    """
    计算给定联合概率分布的联合熵 joint_prob = {(0, 0): 0.25, (0, 1): 0.25, (1, 0): 0.5, (1, 1): 0}
    :param joint_prob: 一个字典,键为一对元素,值为它们同时发生的概率
    :return: 联合熵
    """
    entropy = 0.0
    for pair, prob in joint_prob.items():
        if prob > 0:
            entropy -= prob * math.log(prob, 2)
    return entropy
 
# 示例使用
joint_prob = {(0, 0): 0.25, (0, 1): 0.25, (1, 0): 0.5, (1, 1): 0}
print(joint_entropy(joint_prob))  # 输出联合熵的值

### np.bincount()	
### joint_prob = {(0, 0): 0.25, (0, 1): 0.25, (1, 0): 0.5, (1, 1): 0}
def joint_entropy(joint_prob):
    #### joint_prob = {(0, 0): 0.25, (0, 1): 0.25, (1, 0): 0.5, (1, 1): 0}
    return -np.sum([p * np.log2(p) for row in joint_prob for p in row if p > 0])
	
def mutual_information(x, y):
    joint_prob, x_prob, y_prob = calculate_probabilities(x, y)
    return entropy(x_prob) + entropy(y_prob) - joint_entropy(joint_prob)

x = np.array([2,3,4,1,1,3,4,5,6,2,1,3,4,5,5,6,7,3,2,4,4,2])
print(entropy(x))

方法

scikit-learn库中的函数
     scikit-learn提供了mutual_info_classif函数
	 scikit-learn提供了mutual_info_regression函数
使用`scipy.stats`的`entropy`函数计算联合概率和条件概率,进而得到互信息

代码示例2

from scipy.stats import entropy
import numpy as np

def calculate_probabilities(x, y):
#### 计算histogram2d两个变量的联合频数,然后通过除以总样本数得到联合概率
#### 计算频次直方图(就是计算每段区间的样本数),而并不想画图显示它们,那么可以直接用 np.histogram()。
### bins : int or array_like or [int, int] or [array, array], optional
    x_bins,x_bins =20,20
    joint_prob = np.histogram2d(x, y, bins=(x_bins,y_bins))[0] / len(x)
    x_prob = np.histogram(x, bins=x_bins)[0] / len(x)
    y_prob = np.histogram(y, bins=x_bins)[0] / len(y)
    return joint_prob, x_prob, y_prob
	
def mutual_information(x, y):
    joint_prob, x_prob, y_prob = calculate_probabilities(x, y)
    mi = entropy(x_prob) + entropy(y_prob) - entropy(joint_prob.flatten())
    return mi
	
p和q是两个离散随机变量的概率分布列表。joint_probability函数通过将每个元素的概率相乘来计算联合概率	
# 定义一个函数来计算联合概率
def joint_probability(p, q):
    # 计算两个随机变量的联合概率
    joint_prob = [p[i]*q[i] for i in range(len(p))]
    return joint_prob
 
# 示例:计算两个离散随机变量的联合概率
# 概率分布p和q
p = [0.1, 0.2, 0.3, 0.4]
q = [0.4, 0.3, 0.2, 0.1]
 
# 调用函数计算联合概率
joint_prob = joint_probability(p, q)
print(joint_prob)

计算

 # 获取不重复的(x,y,z)
data_xyz = data.drop_duplicates(subset=None, keep='first', inplace=False)

参考

 https://blog.csdn.net/FFXNFFXN/article/details/124713431

标签:return,互信息,joint,xy,entropy,香农,np,prob
From: https://www.cnblogs.com/ytwang/p/18454778

相关文章

  • Python中,你可以使用`scipy.stats`库中的`entropy`函数来计算两个连续变量之间的KL散度
    在Python中,你可以使用`scipy.stats`库中的`entropy`函数来计算两个连续变量之间的KL散度。这个函数计算的是两个概率分布之间的熵,即KL散度。以下是一个使用`scipy`计算KL散度的示例:首先,你需要安装`scipy`库(如果还未安装的话):```bashpipinstallscipy```然后,你可以使用以下代码......
  • 南大通用GBase 8s 集群网络交互信息概述(上)
    在当今数据驱动的商业环境中,数据库的性能和可靠性是企业成功的关键。GBase8s作为一款的国产数据库系统,其SSC集群架构通过优化网络交互,显著提升了性能和可用性。本文将分两部分聚焦于GBase8sSSC集群的网络交互信息概述和网络吞吐量计算。在GBase 8sSSC集群中,主节点向从节点只传......
  • 南大通用GBase 8s 集群网络交互信息概述(下)
    在上篇文章中,我们了解了GBase8sSSC集群的网络交互机制。本文将聚焦于网络吞吐量的计算,分析SSC集群在不同业务场景下的表现,并与HAC和RHAC集群进行对比。一、无业务场景下的网络吞吐量在无业务时,网络上只有每秒发送的心跳包和心跳包的ACK,则网络吞吐量极低,具体为(114+86)/(1024*1024......
  • 互信息
    参考互信息是信息论中用以评价两个随机变量之间的依赖程度的一个度量。相关概念:信息量:是对某个事件发生或者变量出现的概率的度量,一个事件发生的概率越低,这个事件包含的信息量越大,这跟我们直观上的认知也是吻合的,越稀奇新闻包含的信息量越大,因为这种新闻出现的概率低。香农提......
  • 【机器学习】8. 逻辑斯蒂回归 Logistic function(sigmoid),cross-entropy error,Log-l
    Logisticfunction线性分类器Logisticfunction(sigmoid)极大似然估计Log-likelihoodloss线性分类器Logisticregression是一个线性分类器。如图,1为蓝色,0为红色。这条直线叫做直线边界Logisticfunction(sigmoid)......
  • 2.1_4 奈式准则和香农定理
    一、失真    失真是信号在传输过程中受到外界因素影响导致信号发生了扭曲和变化。主要的外界因素有宽带限制、噪音干扰、磁场干扰。失真主要分为两种情况,可识别失真(有失真但是可以识别出波形信号中的高低电平)和不可识别失真(波形严重失真,无法识别其中的高低电平)。   ......
  • CrossEntropy Loss 计算实例讲解
    CrossEntropyLoss整个计算过程前提条件:分类标签labels和模型输出结果outputs=model(inputs)outputs为一个未经过softmax的logits向量......
  • Binary Cross Entropy(BCE) loss function
    二分分类器模型中用到的损失函数原型。该函数中,预测值p(yi),是经过sigmod激活函数计算之后的预测值。log(p(yi)),求对数,p(yi)约接近1,值越接近0.后半部分亦然,当期望值yi为0,p(yi)越接近1,则1-p(yi)约接近0.在pytorch中,对应的函数为torch.nn.BCELossWithLogits和torch.nn......
  • PyTorch LSTM 模型上的 CrossEntropyLoss,每个时间步一分类
    我正在尝试创建一个LSTM模型来检测时间序列数据中的异常情况。它需要5个输入并产生1个布尔输出(如果检测到异常则为True/False)。异常模式通常连续3-4个时间步长。与大多数LSTM示例不同,它们预测未来数据或对整个数据序列进行分类,我尝试在每个时间步输出True/False检......
  • Topological Entropy and Chaos
    TopologicalEntropyandLi-YorkeChaos"Topologicalentropyofmapsontherealline"Let\(X\)beaHausdorfftopologicalspaceandlet\(f:X\toX\)beacontinuousself-mapon\(X\).Thepair\((X,f)\)iscalledadynamicalsystem.A......