当前位置 博文首页 > XSES_yasuoman的博客:python实现求联合熵
H ( X , Y ) = ? ∑ x , y p ( x , y ) log ? p ( x , y ) = ? ∑ i = 1 n ∑ j = 1 m p ( x i , y j ) log ? p ( x i , y j ) H(X,Y) = - \sum\limits_{{\rm{x}},y} {p(x,y)} \log p(x,y) = - \sum\limits_{i = 1}^n {} \sum\limits_{j = 1}^m {p({x_i},{y_j})\log p({x_i},{y_j})} H(X,Y)=?x,y∑?p(x,y)logp(x,y)=?i=1∑n?j=1∑m?p(xi?,yj?)logp(xi?,yj?)
# 江南大学物联网18级——MH
import math
import numpy as np
def check(probability):
sum_num = 0
for x_index in range(0, len(probability), 1):
for y_index in range(0, len(probability[0]), 1):
if 1 >= probability[x_index][y_index] >= 0:
sum_num += probability[x_index][y_index]
else:
print("第", x_index + 1, "行,第", y_index + 1, "列概率不属于[0,1]")
exit(0)
return (sum_num - 1.0) < 1e-9
def calculate_entropy(probability):
entropy = 0
for x_index in range(0, len(probability)):
for y_index in range(0, len(probability[0])):
if not probability[x_index][y_index] == 0:
entropy += -(probability[x_index][y_index] * math.log2(probability[x_index][y_index]))
return entropy
def array_input_str(num_rows, num_columns):
probability = np.zeros((num_rows, num_columns), dtype=float)
for x_index in range(0, num_rows):
str_array = input().split(" ")
for y_index in range(0, len(str_array)):
probability[x_index][y_index] = str_array[y_index]
return probability
if __name__ == '__main__':
rows = int(input("请输入概率分布矩阵行数\n"))
columns = int(input("请输入概率分布矩阵列数\n"))
print("请输入概率矩阵")
array_probability = array_input_str(rows, columns)
# 概率完备性及是否位于[0,1]区间检验
if check(array_probability):
if len(array_probability) == 1:
print("熵为:", calculate_entropy(array_probability), "bit/sym")
else:
print("联合熵为:", calculate_entropy(array_probability), "bit/sym")
else:
print("概率不具有完备性,请重新输入!")
一维合法输入
请输入概率分布矩阵行数
1
请输入概率分布矩阵列数
4
请输入概率矩阵
0.25 0.125 0.125 0.5
熵为: 1.75 bit/sym
二维合法输入
请输入概率分布矩阵行数
3
请输入概率分布矩阵列数
2
请输入概率矩阵
0.5000 0.2500
0.1250 0.0000
0.0625 0.0625
联合熵为: 1.875 bit/sym
非法输入——概率和不为1
请输入概率分布矩阵行数
3
请输入概率分布矩阵列数
2
请输入概率矩阵
0.5 0.2
0.1 0.1
0.4 0.3
概率不具有完备性,请重新输入!
非法输入——某个概率不属于[0,1]
请输入概率分布矩阵行数
3
请输入概率分布矩阵列数
3
请输入概率矩阵
0.1 0.2 0.3
0.4 0.4 0.5
1.5 0.2 0.4
第 3 行,第 1 列概率不属于[0,1]
cs