Python 用FFT计算高斯分布和的PDF
我试图导出独立随机变量之和的PDF。首先,我想做一个简单的例子:高斯随机变量之和 我惊讶地发现,当我对偶数个高斯随机变量求和时,并没有得到高斯密度函数。我实际上得到: 看起来像是高斯分布的两个半。 另一方面,当我对奇数个高斯分布求和时,我得到了正确的分布: 下面是我用来产生上述结果的代码:Python 用FFT计算高斯分布和的PDF,python,statistics,signal-processing,fft,convolution,Python,Statistics,Signal Processing,Fft,Convolution,我试图导出独立随机变量之和的PDF。首先,我想做一个简单的例子:高斯随机变量之和 我惊讶地发现,当我对偶数个高斯随机变量求和时,并没有得到高斯密度函数。我实际上得到: 看起来像是高斯分布的两个半。 另一方面,当我对奇数个高斯分布求和时,我得到了正确的分布: 下面是我用来产生上述结果的代码: import numpy as np from scipy.stats import norm from scipy.fftpack import fft,ifft import matplotlib.p
import numpy as np
from scipy.stats import norm
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
%matplotlib inline
a=10**(-15)
end=norm(0,1).ppf(a)
sample=np.linspace(end,-end,1000)
pdf=norm(0,1).pdf(sample)
plt.subplot(211)
plt.plot(np.real(ifft(fft(pdf)**2)))
plt.subplot(212)
plt.plot(np.real(ifft(fft(pdf)**3)))
有人能帮我理解为什么高斯分布的偶数和会得到奇数结果吗?使用R
library(ggplot2)
f <- function(n) {
x1 <- rnorm(n)
x2 <- rnorm(n)
X <- x1+x2
return(ds)
}
ds.list <- lapply(10^(2:5),f)
ds <- Reduce(rbind,ds.list)
ggplot(ds,aes(X,fill = n)) + geom_density(alpha = 0.5) + xlab("")
库(ggplot2)
f即使您的代码创建了零均值高斯PDF:
sample=np.linspace(end,-end,1000)
pdf=norm(0,1).pdf(sample)
FFT不知道样本
,只看到样本在0、1、2、3、。。。999FFT期望原点是信号的第一个样本。对于FFT函数,PDF的平均值不是零,而是500
因此,这里的情况是,你将两个平均值为500的PDF相加,得到一个平均值为1000的PDF。因为FFT对空间域信号施加了周期性,所以您可以看到PDF从右侧的图形中退出,从左侧返回
加上3个PDF,平均值变为1500,由于周期性,与500相同,这意味着它最终与原始PDF位于同一位置
解决方案是将原点移到FFT的第一个样本,然后将结果移回:
from scipy.fftpack import fftshift, ifftshift
pdf2 = fftshift(ifft(fft(ifftshift(pdf))**2))
ifftshift
移动信号,使中心样本在第一个样本处结束,并且fftshift
将其移回您想要显示的位置
但是请注意,您生成PDF的方式,源文件不在示例中,因此上述内容将无法准确工作。相反,请使用:
sample=np.linspace(end,-end,1001)
pdf=norm(0,1).pdf(sample)
通过选取1001个样本而不是1000个样本,零正好位于中间样本。我不知道为什么要使用fft来处理pdf?卷积标签和这里的东西有什么关系?你确定要pdf文件吗?你想把中心极限定理形象化吗?
fft(pdf)**2
并不是所有偶数变量的和,它是对信号进行平方处理,这是时域卷积。fft(pdf)**2的变换应该给我两个中心高斯随机变量之和的pdf。fft将卷积转换为乘积。这被标记为Python问题,而不是R问题。