我试图从模拟样本中重建具有3个自由度的卡方分布的pdf。这是我的python代码:
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
norm = stats.norm(0, 1)
x1 = [x * x for x in np.random.randn(1000)]
x2 = [x * x for x in np.random.randn(1000)]
x3 = [x * x for x in np.random.randn(1000)]
f = x1 + x2 + x3
plt.hist(f, 100)
plt.show()
我得到的结果就是这个。
当然这是错误的。如维基百科所示,具有3个自由度的卡方分布的pdf应首先从零开始上升,然后向下移动,而不是像我一样继续攀升。我的代码有什么问题吗?我使用的公式如下:
Q = x1 ^ 2 + x2 ^ 2 + x3 ^ 2
其中x1,x2和x3是独立的标准正态随机变量。
答案 0 :(得分:1)
虽然我尝试了您的代码并获得了与您相同的结果,但如果您使用的是“规范”。变量来生成似乎有用的随机值。
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
norm = stats.norm(0, 1)
x1 = norm.rvs(size=100000)**2
x2 = norm.rvs(size=100000)**2
x3 = norm.rvs(size=100000)**2
f = x1 + x2 + x3
plt.hist(f, 60, normed=True)
# Plot the theoretical density of f
x = np.arange(0, 30, .05)
plt.plot(x, stats.chi2.pdf(x, df=3), color='r', lw=2)
plt.show()
我得到的结果是
答案 1 :(得分:0)
“ +”运算符在Python列表上的作用与在Numpy数组上的作用不同。
f = x1 + x2 + x3
将三个列表合并为一个。但是,您想逐个元素地添加三个列表的内容,可以这样进行:
f = np.array(x1) + np.array(x2) + np.array(x3)