若 k k k个互相独立的随机变量 ξ 1 , ξ 2 , ⋯ , ξ k \xi_1, \xi_2,\cdots,\xi_k ξ1,ξ2,⋯,ξk,均服从标准正态分布,则这k个随机变量的平方和构成一个新变量,这个新变量服从 χ 2 \chi^2 χ2分布。其概率密度函数为
ρ ( x ) = ( 1 / 2 ) k / 2 Γ ( k / 2 ) x k / 2 − 1 e − x / 2 \rho(x)=\frac{(1/2)^{k/2}}{\Gamma(k/2)}x^{k/2-1}e^{-x/2} ρ(x)=Γ(k/2)(1/2)k/2xk/2−1e−x/2
所以对
χ
2
\chi^2
χ2分布而言,其自由度
k
k
k是一个不可避免的参数,一般称之为自由度,在chisquare中就是其输入参数df。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
for i,df in zip([1,2,3,4],[1,2,5,11]):
ax = fig.add_subplot(2,2,i)
ys = np.random.chisquare(df,size=1000)
ax.hist(ys, bins=100)
ax.set_title(f"df={df}")
plt.show()
得到在不同组随机变量的卡方分布为

卡方分布受 k k k值调节,随着 k k k值不断增大,卡方分布越来越接近正态分布。而且卡方分布常用的统计特征也与 k k k密切相关
| 特征 | |
|---|---|
| 期望 | k k k |
| 方差 | k 2 \frac{k}{2} 2k |
| 中位数 | k − 3 2 k-\frac 3 2 k−23附近 |
可以生成一组随机数进行特征值的检验
msg = "k".ljust(5)
msg += "mean".ljust(10)
msg += "std".ljust(10)
msg += "median".ljust(10)
for k in range(1, 10):
ys = np.random.chisquare(k, size=5000)
msg += "\n" + f"{k}".ljust(5)
msg += f"{np.mean(ys):.6}".ljust(10)
msg += f"{np.std(ys):.6}".ljust(10)
msg += f"{np.median(ys):.6}".ljust(10)
print(msg)
效果为
| k | mean | std | median |
|---|---|---|---|
| 1 | 1.04977 | 1.4684 | 0.488511 |
| 2 | 2.00368 | 2.01955 | 1.40244 |
| 3 | 3.04106 | 2.49498 | 2.41431 |
| 4 | 3.92674 | 2.84326 | 3.2806 |
| 5 | 5.01616 | 3.17327 | 4.36389 |
| 6 | 5.97785 | 3.46913 | 5.33356 |
| 7 | 6.93767 | 3.7664 | 6.24881 |
| 8 | 7.94038 | 3.9201 | 7.32785 |
| 9 | 9.0694 | 4.20585 | 8.37701 |
可以明显地看到期望、方差以及中位数和k值的关联性。
如果考虑方差对随机变量的影响,则可得到非中心的
χ
2
\chi^2
χ2分布,在numpy.random中有函数noncentral_chisquare可以生成非中心的卡方分布。和卡方分布相比,非中心卡方分布多了一个非负的参数nonc,测试一下
import matplotlib.pyplot as plt
values = plt.hist(np.random.noncentral_chisquare(3, 20, 100000),
bins=200, density=True)
plt.show()
得到其分布图为
