기타 공부/파이썬

standard normal CDF와 empirical CDF sampling 비교

mini'scloud 2024. 5. 19. 21:45

 

0~10사이 X1,X2..Xn은 uniform하게 분배 되어있고, 독립임

X1의 평균은 뮤, 분산은 시그마제곱이라 했기에

Sn의 평균은 n* μ , 분산은 n*σ^2 (독립이기에...)

Zn을 통해 표준화 => 평균은0, 분산은1이 나오도록 했음

Zn의 CDF가 standard normal CDF로 수렴함

 

n=1일때,

S1 = X1, Z1 = (X1- μ )/ σ

10000개 samlping 한다는건 Z1을 만개 sampling한다는거...(X1이 결국은 10000개 필요)

cf)
n=2이면, Z2 = (X1+X2-2μ)/루트2 * σ

Z가 10000개 sampling할려면(X1,X2 총 20000개 sampling해야함)

 

그리고 이거를 각각 표준화 시켜야함

이거를 empirical CDF를 plot해야함

 

empirical PMF를 통해 CDF를 구하면됨

empirical CDF

n이 커질수록 점프 구간이 작아짐(함수가 매끄러워짐) PDF가 CDF로 나타나게됨

 

standard normal cdf와 empCDF를 비교하는걸 plot해서 나타내보면...

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

nvec = [1, 2, 5, 10, 100, 1000] # numbers of RVs to be averaged and standardized
K = 10000 # number of samples
# parameters for U[a,b]
a = 0.0
b = 10.0
mu = (a+b)/2 #mean of U[a,b]
sigma = np.sqrt((b-a)**2/12) #standard deviation of U[a,b]
X = np.random.uniform(a,b,K)#a~b구간 K개의 sample 생성(X1이 10000개 있어야하니깐)
Zn = (X-mu)/sigma

# empirical CDF
def ecdf(x):
	xs = np.sort(x)
	ys = np.arange(1, len(xs)+1)/float(len(xs))
	return xs, ys

xs,ys = ecdf(Zn)
xf = np.linspace(-5,5,100)
F = stats.norm.cdf(xf) #values of standard noraml CDF

#n=1일때 empricial cdf와 normal cdf비교
plt.figure()
plt.plot(xs, ys, label='EmpCDF of Zn')
plt.plot(xf, F, label='Standard Normal CDF')
plt.xlabel('$z$')
plt.ylabel('Empirical CDF of Zn')
plt.legend()
plt.title('Xi: Uniform Rvs and n=1')
plt.grid(True)
plt.show()



for n in nvec:

    # sum of K samples of uniform RV~U[a,b]
    Sn = np.zeros(K) #0으로 구성된 배열생성
    for i in range(n):
          X = np.random.uniform(a,b,K)
          Sn +=X
    # calculate Z
    Zn = (Sn - n * mu) / (sigma * np.sqrt(n))
    xs,ys = ecdf(Zn)
    # calculate empirical CDF (eCDF) of Z
    ecdf 
    # plot
    plt.figure()
    plt.plot(xs, ys, label='EmpCDF of Zn')
    plt.plot(xf, F, label='Standard Normal CDF')
    plt.xlabel('$z$')
    plt.ylabel('Empirical CDF of Zn')
    plt.legend()
    plt.title(f'Xi: Uniform Rvs and n={n}')
    plt.grid(True)
    plt.show()

#exponential RV

lamBda = 0.5
exp_mu = 1 / lamBda
exp_sigma = 1 /lamBda

for n in nvec:

    # sum of K samples of uniform RV~U[a,b]
    Sn = np.zeros(K) #0으로 구성된 배열생성
    for i in range(n):
          X = np.random.exponential(1/lamBda,K)
          Sn +=X
    # calculate Z
    Zn = (Sn - n * exp_mu) / (exp_sigma * np.sqrt(n))
    xs,ys = ecdf(Zn)
    # calculate empirical CDF (eCDF) of Z
    ecdf 
    # plot
    plt.figure()
    plt.plot(xs, ys, label='EmpCDF of Zn')
    plt.plot(xf, F, label='Standard Normal CDF')
    plt.xlabel('$z$')
    plt.ylabel('Empirical CDF of Zn')
    plt.legend()
    plt.title(f'exp -> Xi: Uniform Rvs and n={n}')
    plt.grid(True)
    plt.show()

 

n=1일때

 

 

 

 

 

 

 

람다 = 0.5 일때, 지수확률변수를 가지는 경우도 구해보면