在R中对转移矩阵随机变量取整:确保行和为1的方案
转移矩阵转分母为36的分数并保证每行和为1的实现方案
核心需求
- 把转移矩阵的十进制概率转换为分母固定为36的分数形式
- 强制所有原本为0/36的项转为1/36
- 调整取整逻辑,优先对每行中概率最高的项进行修正,确保每行分数之和严格为1(即分子总和为36)
实现代码
# 定义转移矩阵 transmat <- structure(c(0.730926989335521, 0.474022677271958, 0.0091743119266055, 0.326860841423948, 0.97411003236246, 0.926605504587156, 0.926605504587156, 0.961722488038278, 0.926605504587156, 0.238720262510254, 0.40632932814351, 0.926605504587156, 0.326860841423948, 0.00323624595469256, 0.0091743119266055, 0.0091743119266055, 0.00478468899521532, 0.0091743119266055, 7.45767767917071e-05, 0.0170925706549332, 0.0091743119266055, 0.00323624595469256, 0.00323624595469256, 0.0091743119266055, 0.0091743119266055, 0.00478468899521532, 0.0091743119266055, 0.00753225445596242, 0.0340159079370452, 0.0091743119266055, 0.00323624595469256, 0.00323624595469256, 0.0091743119266055, 0.0091743119266055, 0.00478468899521532, 0.0091743119266055, 0.00753225445596242, 0.0340159079370452, 0.0091743119266055, 0.00323624595469256, 0.00323624595469256, 0.0091743119266055, 0.0091743119266055, 0.00478468899521532, 0.0091743119266055, 7.45767767917071e-05, 0.0170925706549332, 0.0091743119266055, 0.00323624595469256, 0.00323624595469256, 0.0091743119266055, 0.0091743119266055, 0.00478468899521532, 0.0091743119266055, 7.45767767917071e-05, 0.0170925706549332, 0.0091743119266055, 0.00323624595469256, 0.00323624595469256, 0.0091743119266055, 0.0091743119266055, 0.00478468899521532, 0.0091743119266055, 0.00753225445596242, 0.00016923337282112, 0.0091743119266055, 0.326860841423948, 0.00323624595469256, 0.0091743119266055, 0.0091743119266055, 0.00478468899521532, 0.0091743119266055, 0.00753225445596242, 0.00016923337282112, 0.0091743119266055, 0.00323624595469256, 0.00323624595469256, 0.0091743119266055, 0.0091743119266055, 0.00478468899521532, 0.0091743119266055), dim = c(9L, 9L), dimnames = list( c("00", "02", "13", "18", "25", "50", "60", "80", "95"), c("00", "02", "13", "18", "25", "50", "60", "80", "95"))) # 定义行处理函数,满足需求 process_row <- function(row) { # 1. 将概率值转换为36倍的原始分子 raw_numerators <- row * 36 # 2. 强制所有分子至少为1(对应1/36) numerators <- pmax(raw_numerators, 1) # 3. 计算当前分子总和与目标36的差值 sum_diff <- sum(numerators) - 36 if (sum_diff > 0) { # 若总和超过36,从概率最高的项开始减1,直到总和为36 sorted_indices <- order(-raw_numerators) numerators[sorted_indices[1:sum_diff]] <- numerators[sorted_indices[1:sum_diff]] - 1 } else if (sum_diff < 0) { # 若总和不足36,从概率最高的项开始加1,直到总和为36 sorted_indices <- order(-raw_numerators) numerators[sorted_indices[1:abs(sum_diff)]] <- numerators[sorted_indices[1:abs(sum_diff)]] + 1 } # 转换为分数字符串格式 paste0(numerators, "/36") } # 应用函数到转移矩阵的每一行 fractions_matrix <- t(apply(transmat, 1, process_row)) # 验证每行分子和是否为36 row_sums <- apply(fractions_matrix, 1, function(x) sum(as.integer(sub("/36", "", x)))) print(row_sums) # 应输出全36
代码说明
- 强制最小分子: 使用
pmax(raw_numerators,1)确保所有项的分子至少为1,直接满足0/36转1/36的要求。 - 总和修正逻辑:
- 若强制最小分子后总和超过36,从概率最高的项依次减1,尽可能降低对整体概率分布的影响。
- 若总和不足36(极端情况),同样优先给概率最高的项加1,符合需求中的优先调整规则。
- 格式转换: 将最终分子拼接为
x/36的字符串格式,保持统一的分数形式。
内容的提问来源于stack exchange,提问作者Geoarch
相关产品推荐
相关产品推荐

