You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用暴力法求解极大似然估计:代码续写求助

暴力法求解正态分布极大似然估计的后续代码实现

先修正你现有代码里的两处问题:

  • data 需要定义为R的数值向量,不能直接用逗号分隔
  • neglog 的数组维度参数写错了,应该用length(mu)和length(sigma)指定行列数

修正后的初始代码:

# 定义数据向量
data <- c(8.453532, 10.025041, 11.495339, 9.367600, 8.333229, 
          9.788753, 10.883344, 10.543059, 9.869095, 10.799819)

# 生成μ和σ的遍历序列
mu_seq <- seq(5, 15, 0.1)
sigma_seq <- seq(0.5, 1.5, 0.1)

# 初始化负对数似然数组,行对应μ,列对应σ
neglog <- array(0, dim = c(length(mu_seq), length(sigma_seq)))

接下来补全核心的遍历和似然计算逻辑:

# 嵌套循环遍历所有μ和σ的组合
for (i in 1:length(mu_seq)) {
  for (j in 1:length(sigma_seq)) {
    mu <- mu_seq[i]
    sigma <- sigma_seq[j]
    # 计算每个数据点的正态分布对数密度,求和后取负(负对数似然)
    # 我们的sigma序列已经保证大于0,无需额外判断
    neglog[i, j] <- -sum(dnorm(data, mean = mu, sd = sigma, log = TRUE))
  }
}

# 找到最小负对数似然对应的索引
min_index <- which(neglog == min(neglog), arr.ind = TRUE)

# 提取极大似然估计值
mle_mu <- mu_seq[min_index[1]]
mle_sigma <- sigma_seq[min_index[2]]

# 输出结果
cat("极大似然估计的μ:", mle_mu, "\n")
cat("极大似然估计的σ:", mle_sigma, "\n")

补充说明

  • 用负对数似然代替原始似然函数,是因为直接计算似然容易出现数值下溢,对数转换后数值更稳定,且最大化似然等价于最小化负对数似然
  • dnorm(..., log = TRUE)直接返回对数密度,比手动计算log效率更高
  • 如果想直观看到似然曲面,可以加这段可视化代码:
# 未安装包先运行:install.packages("plot3D")
library(plot3D)

# 绘制负对数似然的3D曲面
persp3D(x = mu_seq, y = sigma_seq, z = neglog,
        xlab = "μ", ylab = "σ", zlab = "负对数似然",
        main = "负对数似然曲面", theta = 45, phi = 30)

内容的提问来源于stack exchange,提问作者Rasha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:50:27