Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用FFT计算高斯分布和的PDF_Python_Statistics_Signal Processing_Fft_Convolution - Fatal编程技术网

Python 用FFT计算高斯分布和的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

我试图导出独立随机变量之和的PDF。首先,我想做一个简单的例子:高斯随机变量之和

我惊讶地发现,当我对偶数个高斯随机变量求和时,并没有得到高斯密度函数。我实际上得到:

看起来像是高斯分布的两个半。 另一方面,当我对奇数个高斯分布求和时,我得到了正确的分布:

下面是我用来产生上述结果的代码:

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问题。