Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高斯到均匀分布的转换在均匀分布的边缘有误差_Python_Distribution_Gaussian_Cdf_Uniform Distribution - Fatal编程技术网

Python 高斯到均匀分布的转换在均匀分布的边缘有误差

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 ===================

我有一个从高斯分布生成的样本数,我想把它们转换成均匀分布。我遵循以下步骤:

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)

有人能帮我解决这个问题吗?也许近似法不太准确?

我想我看到了问题,但我不确定。如果蓝色曲线是原始高斯曲线,橙色曲线是归一化高斯曲线,则其宽度比应为2:1。不是,橙色的曲线太宽了。在函数
gaussian\u normalization
中对宽度进行规格化时,将宽度除以sigmas比率的平方根。我认为那里不应该有
sqrt
。所以下一步,映射到均匀分布,不起作用,因为归一化的高斯分布太宽了。@PaulCornelius哦,是的,你是对的。最初我使用方差,当我切换到std时,我忘记删除sqrt函数。它现在运行良好,我得到了一个很好的均匀分布。非常感谢。我想我看到了问题,但我不确定。如果蓝色曲线是原始高斯曲线,橙色曲线是归一化高斯曲线,则其宽度比应为2:1。不是,橙色的曲线太宽了。在函数
gaussian\u normalization
中对宽度进行规格化时,将宽度除以sigmas比率的平方根。我认为那里不应该有
sqrt
。所以下一步,映射到均匀分布,不起作用,因为归一化的高斯分布太宽了。@PaulCornelius哦,是的,你是对的。最初我使用方差,当我切换到std时,我忘记删除sqrt函数。它现在运行良好,我得到了一个很好的均匀分布。非常感谢你。