验证双随机矩阵(doubly stochastic matrix) 满足C(P)=C(P^T)

时间:2024-11-17 07:32:00

验证双随机矩阵(doubly stochastic matrix) 满足C( P P P)=C(P T ^T T)

双随机矩阵:

在数学中,一个双随机矩阵doubly stochastic matrix)是一个满足以下条件的矩阵:

  1. 非负矩阵:矩阵中的每个元素都是非负的。
  2. 行和为 1:矩阵的每一行的元素之和都等于1。
  3. 列和为 1:矩阵的每一列的元素之和也等于1。

因此,双随机矩阵是一个同时满足“每一行的元素和为1”和“每一列的元素和为1”的矩阵。


验证程序:

import numpy as np
from scipy.optimize import minimize

def mutual_information(p, P):
    # 计算输出分布
    py = p @ P
    
    # 计算H(Y|X)
    hyx = 0
    for i in range(len(P)):
        for j in range(len(P[0])):
            if P[i,j] > 0:
                hyx -= p[i] * P[i,j] * np.log2(P[i,j])
    
    # 计算H(Y)
    hy = -sum(py[j] * np.log2(py[j]) if py[j] > 0 else 0 for j in range(len(py)))
    
    return hy - hyx

def channel_capacity(P):
    n = len(P)
    
    # 定义约束:概率和为1
    constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
    # 定义边界:概率在[0,1]之间
    bounds = [(0,1) for _ in range(n)]
    
    # 初始猜测:均匀分布
    x0 = np.ones(n)/n
    
    # 最大化互信息
    result = minimize(lambda x: -mutual_information(x, P), x0,
                     constraints=constraints, bounds=bounds)
    
    return -result.fun

# 定义双随机矩阵

# 对称信道
# P = np.array([[0.5,0.3,0.2],
#               [0.2,0.5,0.3],
#               [0.3,0.2,0.5]])

# 不满足对称信道
P = np.array([[0.5,0.4,0.1],
              [0.3,0.3,0.4],
              [0.2,0.3,0.5]])

# 计算P的信道容量
cap_P = channel_capacity(P)
# 计算P^T的信道容量
cap_PT = channel_capacity(P.T)

print(f"C(P) = {cap_P:.6f} bits")
print(f"C(P^T) = {cap_PT:.6f} bits")

验证结果:

1. 满足双随机且是对称信道:

#对称信道
P = np.array([[0.5,0.3,0.2],
              [0.2,0.5,0.3],
              [0.3,0.2,0.5]])

计算结果:

在这里插入图片描述

对于对称信道:

C( P P P) = log(m) - H(Y|ai) =log3 - H(0.5, 0.3, 0.2)

C(P T ^T T) = log(m) - H(Y|ai) =log3 - H(0.5, 0.3, 0.2)

直接可以看出C( P P P)=C(P T ^T T)

2. 满足双随机但不是对称信道:

# 不满足对称信道
P = np.array([[0.5,0.4,0.1],
              [0.3,0.3,0.4],
              [0.2,0.3,0.5]])

计算结果:
在这里插入图片描述

3. 结论:

由此可见:对于转移概率满足双随机矩阵的信道,满足C( P P P) = C(P T ^T T)。