高斯噪声发生器算法麻烦

信息处理 噪音 高斯
2022-02-18 20:50:46

我偶然发现了以下用于高斯噪声生成的算法,但我根本不知道它应该如何工作。算法如下:

高斯噪声算法

首先:不依赖于q_1,因此每次都会产生相同的结果 - 我假设\arg\min_i (|q_1 - p[i]|)是什么真的是这里的意思。但还有更多:我可以安全地假设q_1在[0,1]内线性分布,否则我可以缩放它,然后四舍五入,不会有那么多麻烦。在这种情况下,我遇到了另一个问题:由于q_1是线性分布的,因此选择接近零的j(这就是\mu=0所暗示的)不太可能,所以我怀疑得到的分布不是正态分布。j=argmini(q1p[i])q1argmini(|q1p[i]|)q1[0,1]q1jμ=0

这个算法让我想起了逆变换采样(http://en.wikipedia.org/wiki/Inverse_transform_sampling);但是它似乎不是它的变体。我在这里有点困惑,因为这有点容易计算,如果 p 是这里的累积分布,我会马上理解这一点。

所以基本上我坚持理解这一点,并期待任何关于我错在哪里的提示。

提前谢谢各位!

2个回答

我同意你的看法,这看起来像是对逆变换生成器的错误描述。

  • 不应该像描述的那样,而应该是这些的前缀和,对应于累积分布p[i]

  • 确实应该取绝对值(或只允许正值)。argmin

  • 由于 pdf 仅在正上计算,统一绘图的范围应为(或缩放。)i[0,12]p[i]2

(当不累积时,它们在中,范围没有意义。)p[i][0,1σ2π][0,1]

为了提高效率,您可以预先计算索引的查找表以获得足够密集的iq1

是的,算法明显很差。我已经快速尝试在 R 中实现它(如前所述),这是结果值的直方图。请让我知道它是否有问题(如算法所述,而不是试图修复算法)。

它看起来与均匀分布的随机变量没有什么不同。

在此处输入图像描述


下面的R代码

#21675


q_21675 <- function()
{
  #1 
  sigma_i <- 3
  #2
  G <- 256
  p <- rep(0,G)
  for (i in 1:G)
  {
    p[i] <- 1/(sigma_i*sqrt(2*pi))*exp(-i*i/(2*sigma_i*sigma_i))
  }
  #3 
  q1 <- runif(1,0,1)
  diff <- rep(0,G)
  for (j in 1:G)
  {
    diff[j] <- q1-p[j]
  }
  j <- which.min(diff)
  #4
  q2 <- runif(1,-1,1)
  addition <- q2*j
  return(addition)
}


x <- rep(0,1000)
for (t in 1:1000)
{
  x[t] <- q_21675()
}

hist(x)