输入XY的联合概率分布p(xy),输出H(XY)、H(Y|X)、H(X|Y)
import numpy as np
def Entropy(DataList):
SUM = 0
for i in DataList:
if i > 1 or i <= 0: #健壮性判断
print("概率分布错误")
else:
SUM = SUM -np.log2(i)* i #熵值计算
return SUM
pXY = eval(input("请输入X和Y的联合概率分布:如[a1b1,a1b2,a2b1,a2b2]"))
lenx = int(input("请输入X的样本个数:"))
HXY = Entropy(pXY)#计算联合熵
pXY2 = [pXY[i:i+lenx] for i in range(0,len(pXY),lenx)]#将列表按x个数拆分
HY = Entropy(np.sum(pXY2, axis=0))#对子列表转置后求和再求熵H(Y)
HX = Entropy(np.sum(pXY2, axis=1))#对子列表求和再求熵H(X)
HY_X = HXY - HX#算条件熵
HX_Y = HXY - HY
print( "H(XY) = ", float( "{0:.5}".format(HXY)))
print( "H(Y|X) = ", float( "{0:.5}".format(HY_X)))
print( "H(X|Y) = ",