如何用Python实现符合特定偏置规则的比特串转移概率矩阵?
实现满足规则的比特通信转移概率矩阵
要实现符合你要求的转移概率矩阵,核心思路是给不同类型的比特翻转分配差异化的权重,通过加权后的概率分布满足“翻转越多概率越小”和“0→1翻转概率低于1→0”的不对称性,最后归一化保证每行概率和为1。
核心逻辑拆解
我们需要为每个转移i→j(实际值i,观测值j)计算两个关键指标:
k01:从i的0比特翻转为j的1比特的数量(0→1翻转次数)k10:从i的1比特翻转为j的0比特的数量(1→0翻转次数)
然后基于这两个指标定义未归一化概率:
- 为了满足翻转越多概率越小:总翻转次数(
k01 + k10)越多,未归一化概率越低 - 为了满足不对称性:给0→1翻转分配更高的“代价”(或更低的权重),使得相同翻转次数下,包含更多0→1的转移概率更小
这里推荐两种常用的概率计算方式:
方法1:指数衰减(推荐,易调整)
利用指数函数的衰减特性,给不同翻转类型设置不同的代价权重:
- 设
w01为0→1翻转的代价(比如w01=2.0) - 设
w10为1→0翻转的代价(比如w10=1.0),保证w01 > w10(这样0→1翻转的代价更高,对应概率更低)
未归一化概率为:exp(-(k01 * w01 + k10 * w10)),然后对每行的未归一化概率求和并归一化,确保每行和为1。
Python代码实现
import numpy as np def create_transition_matrix(n): size = 2 ** n P = np.zeros((size, size)) # 定义翻转代价:w01 > w10 保证不对称性 w01 = 2.0 w10 = 1.0 for i in range(size): unnormalized = [] for j in range(size): k01 = 0 k10 = 0 # 逐比特统计翻转类型 for m in range(n): bit_i = (i >> m) & 1 bit_j = (j >> m) & 1 if bit_i == 0 and bit_j == 1: k01 += 1 elif bit_i == 1 and bit_j == 0: k10 += 1 # 计算未归一化概率 prob = np.exp(-(k01 * w01 + k10 * w10)) unnormalized.append(prob) # 归一化,保证每行和为1 unnormalized = np.array(unnormalized) P[i] = unnormalized / unnormalized.sum() return P # 测试n=3(8×8矩阵) P = create_transition_matrix(3) # 验证规则2:p(001|000) < p(000|001) print("p(001|000):", P[0, 1]) print("p(000|001):", P[1, 0]) # 验证规则1:p(100|000)(1次翻转)> p(110|000)(2次翻转) print("p(100|000):", P[0, 4]) print("p(110|000):", P[0, 6])
方法2:多项式权重(更直观)
直接给不同翻转类型设置概率权重:
- 设
a为单个0→1翻转的权重(比如a=0.1) - 设
b为单个1→0翻转的权重(比如b=0.3),保证0 < a < b < 1
未归一化概率为:(a ** k01) * (b ** k10),同样归一化后得到每行和为1的矩阵。
代码片段替换
把方法1中的未归一化概率计算替换为:
prob = (0.1 ** k01) * (0.3 ** k10)
参数调整说明
- 调整
w01和w10(或a和b)的差值,可以控制不对称性的强弱:差值越大,0→1和1→0的概率差异越明显 - 增大
w01和w10的绝对值(或减小a和b),会让非对角元素的概率更小,矩阵更接近对角矩阵(即错误概率更低)
内容的提问来源于stack exchange,提问作者Marion
相关产品推荐
相关产品推荐

