验证双随机矩阵(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 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]])
计算结果: