如何绘制?X1700( 1 - x)300x1700(1−x)300

机器算法验证 数据可视化 可能性 贝塔分布 数字
2022-04-15 17:41:16

我正在尝试在 R 上绘制伯努利似然函数:

x1700(1x)300

但是当我尝试在 R 上绘制这个函数时,它看起来像这样: 在此处输入图像描述

我认为最大值应该是 0.85,但它向我展示了一个完全平坦的图表,最大值为 0.001

当我尝试用 z=1800, N=2000 绘制似然函数时,它看起来还不错

在此处输入图像描述

你认为是什么问题?提前致谢!

4个回答

斯蒂芬关于浮点的回答是正确的。作为一种解决方法,您可以在对数刻度上绘制数据。而不是绘图

x1700(1x)300

你会策划

1700log(x)+300log(1x)

当将数据保持在浮点运算的合理范围内时,在对数刻度上工作可能会很好。因为是单调递增的,所以值将保持相同的顺序(任何最大值出现在的相同值处),即使它们以不同的比例报告。logx

该似然函数与参数的 beta 密度成正比,因此可以绘制为 beta 密度,因为似然函数只定义为比例:什么是“likelihood is only defined up to a乘法比例常数”在实践中是什么意思? 导致α=1701,β=301

Beta 似然函数

绘制对数似然函数可能会提供更多信息:

Beta 对数似然函数

作为参考,下面使用的 R 代码:

    plot( function(x) dbeta(x, 1701, 301), from=0, to=1, 
              col="red", n=1001, main="Beta likelihood function")
    plot( function(x) dbeta(x, 1701, 301, log=TRUE), from=0, 
              to=1, col="red", n=1001, 
              main="Beta loglikelihood function")

最大值的值(实际上是)是R 可以使用的最小数字约为您只是用完了数字空间。如果您真的想绘制此图,请使用专用包进行高精度算术。yx=0.85exp(845.42)10367.16double2×10308

您可以在线性刻度上准确地绘制此曲线。

为参数。a=1700b=300

对于的最大值处获得(相应的 Beta分布)。那里,f(x)=xa(1x)b0<x<1xm=(a1)/(a+b2)(a,b)

ym=logf(xm)=alog(xm)+blog(1xm)

是曲线峰值的对数。通过定义扩大规模

f(x)=exp(ym)f(x)=exp(alog(x)+blog(1x)ym).

这在其峰值处达到因此,的图适合垂直范围 要获得您需要做的就是重新标记垂直轴(通过将其所有值乘以1f[0,1].f, exp(ym).

这种方法适用于任何图形环境。这是一个示例,完全使用双精度算术计算R

图1

本身不需要比 IEEE 支持的更多的数字来表示,您就可以成功 这是ab1015.6.a=108b=1013:

图 2

都很大时,两条曲线都非常接近高斯曲线。出于所有实际目的,我们所要做的就是绘制一个高斯曲线,然后标记两个轴适当地根据参数。)abab

只要您可以轻松地计算并找到(或估计)它的最大值,这种方法就会起作用——大多数应用程序都是这种情况。logf(x)


下面的R代码只是为了证明这个概念:对于通用工作,标记算法需要稍微麻烦一些。

betaplot <- function(a, b, xlim=c(-4,4), scale=1, nticks=5, interval=2, ...) { # a,b>1
  n <- a + b
  mu <- a / n                                 # Mean
  sigma <- sqrt(((a / n) * (b / n)) / (n+1))  # SD
  xlim <- xlim * sigma + mu                   # Plot limits
  m <- (a - 1) / (n - 2)                      # Mode
  f <- function(x) a * log10(x) + b * log10(1-x)
  logmax <- round(f(m))                       # Nearest whole power of 10 to max
  #
  # The plot itself.
  #
  curve(exp(log(10) * (f(x) - logmax)), xlim=xlim, ylim=c(0,scale), ylab="",
        yaxt = "n", ...)
  #
  # Ticks and labels.
  #
  yticks <- seq(0, nticks) * interval
  yticks <-  yticks[yticks <= 10*scale]
  rug(yticks/10, side=2, ticksize=-0.03)
  for (y in yticks) {
    if (y==0) {s <- 0} else 
      if (y==10) {s <- bquote(10^.(logmax))} else 
        {s <- bquote(.(y)%*%10^.(logmax-1))}
    mtext(s, side=2, line=1, at=y/10)
  }
}
#
# Examples.
#
betaplot(1700, 300, scale=0.8, nticks=4, interval=2, lwd=2)
betaplot(1e8, 1e13, scale=0.6, nticks=3, interval=2, lwd=2)