Python 高斯到均匀分布的转换在均匀分布的边缘有误差
我有一个从高斯分布生成的样本数,我想把它们转换成均匀分布。我遵循以下步骤: 1-标准化高斯分布,使其平均值为0,标准差为1 2-使用此标准化高斯分布的CDF获得均匀分布 我使用解释的方法近似CDF。然而,最终结果并不一致。在中间看起来是均匀的,但在边缘(0和1附近)有误差。 这是我的代码:Python 高斯到均匀分布的转换在均匀分布的边缘有误差,python,distribution,gaussian,cdf,uniform-distribution,Python,Distribution,Gaussian,Cdf,Uniform Distribution,我有一个从高斯分布生成的样本数,我想把它们转换成均匀分布。我遵循以下步骤: 1-标准化高斯分布,使其平均值为0,标准差为1 2-使用此标准化高斯分布的CDF获得均匀分布 我使用解释的方法近似CDF。然而,最终结果并不一致。在中间看起来是均匀的,但在边缘(0和1附近)有误差。 这是我的代码: import numpy as np import matplotlib.pyplot as plt # ================= Parameers ===================
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)
有人能帮我解决这个问题吗?也许近似法不太准确?我想我看到了问题,但我不确定。如果蓝色曲线是原始高斯曲线,橙色曲线是归一化高斯曲线,则其宽度比应为2:1。不是,橙色的曲线太宽了。在函数
gaussian\u normalization
中对宽度进行规格化时,将宽度除以sigmas比率的平方根。我认为那里不应该有sqrt
。所以下一步,映射到均匀分布,不起作用,因为归一化的高斯分布太宽了。@PaulCornelius哦,是的,你是对的。最初我使用方差,当我切换到std时,我忘记删除sqrt函数。它现在运行良好,我得到了一个很好的均匀分布。非常感谢。我想我看到了问题,但我不确定。如果蓝色曲线是原始高斯曲线,橙色曲线是归一化高斯曲线,则其宽度比应为2:1。不是,橙色的曲线太宽了。在函数gaussian\u normalization
中对宽度进行规格化时,将宽度除以sigmas比率的平方根。我认为那里不应该有sqrt
。所以下一步,映射到均匀分布,不起作用,因为归一化的高斯分布太宽了。@PaulCornelius哦,是的,你是对的。最初我使用方差,当我切换到std时,我忘记删除sqrt函数。它现在运行良好,我得到了一个很好的均匀分布。非常感谢你。