У преобразования Гаусса в Равномерное распределение есть ошибки на краях Равномерного распределения
У меня есть несколько выборок, сгенерированных из распределения Гаусса, и я хочу преобразовать их, чтобы они имели равномерное распределение. Я следую за этими шагами:
1- Стандартизируйте распределение Гаусса, чтобы оно имело среднее значение 0 и стандартное значение 1.
2- Используйте CDF этого стандартизированного распределения Гаусса, чтобы получить равномерное распределение.
Я аппроксимирую CDF, используя метод, описанный здесь. Однако конечный результат не является единообразным. По середине оно выглядит равномерно, но по краям (около 0 и 1) есть ошибки.
Это мой код:
import numpy as np
import matplotlib.pyplot as plt
# ================= Parameers ===================
mu = 5.0
sig = 2.0
data_cnt = 10**6
bin_cnt = 10**3
# ================ Functions ===================
# Estimates gaussian distribution parameters from data using ML
def gaussian_estimation(vector):
mu = np.mean(vector)
sig = np.std(vector)
return (mu,sig)
# Adjusts the data so it forms a gaussian with mean of 0 and std of 1
def gaussian_normalization(vector, char = None):
if char is None:
mu , sig = gaussian_estimation(vector)
else:
mu = char[2]
sig = char[3]
normalized = (vector-mu)/np.sqrt(sig)
return normalized
# Taken from https://en.wikipedia.org/wiki/Normal_distribution#Cumulative_distribution_function
def CDF(x, max_i = 100):
sum = x
value = x
for i in np.arange(max_i)+1:
value = value*x*x/(2.0*i+1)
sum = sum + value
return 0.5 + (sum/np.sqrt(2*np.pi))*np.exp(-1*(x*x)/2)
def gaussian_to_uniform(vector, if_normal = False):
if (if_normal == False):
vector = gaussian_normalization(vector)
uni = np.apply_along_axis(CDF, 0, vector)
return uni
# ========== Step1: Data Generation ============
data = np.random.normal(mu, sig, data_cnt)
plt.hist(data,bin_cnt)
# ========= Step2: Data Normalization ==========
data2 = gaussian_normalization(data)
plt.hist(data2,bin_cnt)
# ======== Step3: Data Uniformization ==========
data3 = gaussian_to_uniform(data2, if_normal = True)
plt.hist(data3,bin_cnt)
Так может кто-нибудь помочь мне с этим вопросом? Может быть, метод приближения не так точен?