当前位置 博文首页 > XSES_yasuoman的博客:python实现求联合熵

    XSES_yasuoman的博客:python实现求联合熵

    作者:[db:作者] 时间:2021-08-31 22:26

    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=1n?j=1m?p(xi?,yj?)logp(xi?,yj?)

    “entropy” python完整代码如下:

    导入包

    # 江南大学物联网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
    

    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
    请输入概率分布矩阵列数
    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.43 行,第 1 列概率不属于[0,1]
    
    cs