从0开始学习R语言--Day63--马尔科夫链中的贝叶斯平滑

发布于:2025-08-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

在用马尔科夫链分析数据的空间转移特征以及未来发展规律时,我们通常会用四分位法去分组并观察每种分类转移成其他类别的概率,从而分辨地域间是否具有趋同现象。

但是当数据不是均匀分布的时候,很容易出现某类组别的样本量较少,这种情况很容易出现某类别里的样本数为0,从而影响转移矩阵(该类别的概率由于没有样本是NA),对于这种情况,贝叶斯平滑的处理方式是认为是数据里该分组的信息是未知的,从概率上来说,即是该类别转移为每一种类别的概率都相同,会赋予它们相同的概率。当然,如果数据本身的含义不一样,或者有相关研究提供的话,可以手动选择赋予不一样的概率。

以下是一个例子:

library(ggplot2)
library(reshape2)

set.seed(123)
states <- c("A", "B", "C", "D")
num_states <- length(states)

# 生成真实转移矩阵(不可约的)
true_transition <- matrix(c(
  0.7, 0.2, 0.1, 0.0,
  0.1, 0.6, 0.2, 0.1,
  0.0, 0.3, 0.6, 0.1,
  0.1, 0.1, 0.2, 0.6
), nrow = num_states, byrow = TRUE,
dimnames = list(states, states))

# 生成观察数据(某些转移样本不足)
obs_counts <- matrix(c(
  70, 20, 10, 0,
  2, 12, 4, 2,  # 从B出发的样本很少
  0, 6, 12, 2,
  1, 1, 2, 6    # 从D出发的样本很少
), nrow = num_states, byrow = TRUE,
dimnames = list(states, states))

mle_transition <- obs_counts / rowSums(obs_counts)
mle_transition[is.na(mle_transition)] <- 0  # 处理全零行

print("最大似然估计矩阵:")
print(round(mle_transition, 3))

# Dirichlet先验参数设置
alpha <- 0.1  # 较小的值保留更多数据特性
# alpha <- 1   # Laplace平滑
# alpha <- 0.01 # 更弱的平滑

bayesian_smooth_transition <- (obs_counts + alpha) / 
  (rowSums(obs_counts) + alpha * num_states)

print("贝叶斯平滑后矩阵:")
print(round(bayesian_smooth_transition, 3))



# 准备数据
plot_data <- melt(list(
  True = true_transition,
  MLE = mle_transition,
  Bayesian = bayesian_smooth_transition
))

ggplot(plot_data, aes(x = Var2, y = Var1, fill = value)) +
  geom_tile() +
  geom_text(aes(label = round(value, 2)), color = "white") +
  facet_wrap(~ L1, nrow = 1) +
  scale_fill_gradient(low = "blue", high = "red") +
  labs(title = "转移矩阵比较: 真实 vs MLE vs 贝叶斯平滑",
       x = "To State",
       y = "From State") +
  theme_minimal()
# 计算KL散度评估估计质量
kl_divergence <- function(p, q) {
  sum(p * log(p/q), na.rm = TRUE)
}

mle_kl <- kl_divergence(true_transition, mle_transition)
bayes_kl <- kl_divergence(true_transition, bayesian_smooth_transition)

cat(sprintf("MLE估计KL散度: %.4f\n贝叶斯平滑KL散度: %.4f", mle_kl, bayes_kl))

输出:

[1] "最大似然估计矩阵:"
    A   B   C   D
A 0.7 0.2 0.1 0.0
B 0.1 0.6 0.2 0.1
C 0.0 0.3 0.6 0.1
D 0.1 0.1 0.2 0.6
[1] "贝叶斯平滑后矩阵:"
      A     B     C     D
A 0.698 0.200 0.101 0.001
B 0.103 0.593 0.201 0.103
C 0.005 0.299 0.593 0.103
D 0.106 0.106 0.202 0.587
MLE估计KL散度: 0.0000
贝叶斯平滑KL散度: 0.0066

图像表明,MLE(最大似然)和True矩阵中,某些转移概率(如C→A、A→D)为0,说明这些转移在样本中完全没有出现,而贝叶斯矩阵的所有转移概率都大于0,即使原始样本中某些转移未观测到(如A→D),也被赋予了一个小概率(如0.01或0.11等);而输出中的MLE估计KL散度虽然看起来更优,但这是因为存在零概率导致的,不是真正意义上的更优,因为真实场景下不存在绝对的0概率。


网站公告

今日签到

点亮在社区的每一天
去签到