EM算法--隐含变量

# 创建一个示例数据集,假设数据由两个高斯分布混合而成
set.seed(123)
data <- c(rnorm(1000, mean = 2, sd = 1), rnorm(1000, mean = 7, sd = 2))
#概率密度函数
f <- function(data,mu,sigma) {
  f<-1/(sqrt(2*pi)*sigma)*exp(-(data-mu)^2/2*sigma^2)
  return(f)
}
# 定义EM算法函数
em_algorithm <- function(data, k = 2, max_iterations = 100) {
  # 初始化参数
  n <- length(data)
  w <- rep(1/k, k)  # 混合系数
  mu <- sample(data, k)  # 均值参数
  sigma <- rep(1, k)  # 标准差参数
  # EM算法迭代
  for (iteration in 1:max_iterations) {
    # E步骤:计算每个数据点属于每个分布的后验概率
    posterior <- matrix(0, nrow = n, ncol = k)
    for (i in 1:n) {
      for (j in 1:k) {
        posterior[i, j] <- w[j] * f(data[i],mu[j],sigma[j])
      }
      posterior[i, ] <- posterior[i, ] / sum(posterior[i, ])  # 归一化
    }
    
    # M步骤:更新参数估计
    for (j in 1:k) {
      w[j] <- sum(posterior[, j]) / n  # 更新混合系数
      mu[j] <- sum(posterior[, j] * data) / sum(posterior[, j])  # 更新均值参数
      sigma[j] <- sqrt(sum(posterior[, j] * (data - mu[j])^2) / sum(posterior[, j]))  # 更新标准差参数
    }
  }
  # 返回最终的估计结果
  return(list(weights = w, means = mu, standard_deviations = sigma))
}
# 使用EM算法估计参数
result <- em_algorithm(data, k = 2, max_iterations = 100)
result$means
result$standard_deviations

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值