验证双随机矩阵(doubly stochastic matrix) 满足C( P P P)=C(P T ^T T)
双随机矩阵:
在数学中,一个双随机矩阵(doubly stochastic matrix)是一个满足以下条件的矩阵:
- 非负矩阵:矩阵中的每个元素都是非负的。
- 行和为 1:矩阵的每一行的元素之和都等于1。
- 列和为 1:矩阵的每一列的元素之和也等于1。
因此,双随机矩阵是一个同时满足“每一行的元素和为1”和“每一列的元素和为1”的矩阵。
验证程序:
import numpy as np
from scipy.optimize import minimizedef mutual_information(p, P):# 计算输出分布py = p @ P# 计算H(Y|X)hyx = 0for 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 - hyxdef channel_capacity(P):n = len(P)# 定义约束:概率和为1constraints = ({'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]])
计算结果: