2022年 12月 19日

python实现求联合熵

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,yp(x,y)logp(x,y)=i=1nj=1mp(xi,yj)logp(xi,yj)

“entropy” python完整代码如下:

导入包

# 江南大学物联网18级——MH
import math
import numpy as np
  • 1
  • 2
  • 3

检查概率完备性

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

计算熵

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输入概率矩阵

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

main函数

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:

一维合法输入

请输入概率分布矩阵行数
1
请输入概率分布矩阵列数
4
请输入概率矩阵
0.25 0.125 0.125 0.5
熵为: 1.75 bit/sym
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

二维合法输入

请输入概率分布矩阵行数
3
请输入概率分布矩阵列数
2
请输入概率矩阵
0.5000 0.2500
0.1250 0.0000
0.0625 0.0625
联合熵为: 1.875 bit/sym
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

非法输入——概率和不为1

请输入概率分布矩阵行数
3
请输入概率分布矩阵列数
2
请输入概率矩阵
0.5 0.2
0.1 0.1
0.4 0.3
概率不具有完备性,请重新输入!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

非法输入——某个概率不属于[0,1]

请输入概率分布矩阵行数
3
请输入概率分布矩阵列数
3
请输入概率矩阵
0.1 0.2 0.3
0.4 0.4 0.5
1.5 0.2 0.43 行,第 1 列概率不属于[0,1]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9