gpt4 book ai didi

python - python中直方图的概率密度函数以拟合另一个直方图

转载 作者:太空狗 更新时间:2023-10-29 21:43:53 27 4
gpt4 key购买 nike

我有一个关于拟合和获取随机数的问题。

情况是这样的:

首先,我有一个来自数据点的直方图。

import numpy as np

"""create random data points """
mu = 10
sigma = 5
n = 1000

datapoints = np.random.normal(mu,sigma,n)

""" create normalized histrogram of the data """

bins = np.linspace(0,20,21)
H, bins = np.histogram(data,bins,density=True)

我想将此直方图解释为概率密度函数(带有例如 2 个自由参数),以便我可以使用它来生成随机数,并且我还想使用该函数来拟合另一个直方图。

谢谢你的帮助

最佳答案

您可以使用累积密度函数从任意分布中生成随机数,如 described here .

使用直方图生成平滑的累积密度函数并非完全微不足道;您可以使用插值法,例如 scipy.interpolate.interp1d() 对于您的垃圾箱中心之间的值,这对于具有相当多的垃圾箱和项目的直方图来说效果很好。但是,您必须决定概率函数尾部的形式,即对于小于最小 bin 或大于最大 bin 的值。您可以根据例如将高斯拟合到您的直方图)或适合您的问题的任何其他形式的尾部来为您的分布提供高斯尾部,或者简单地截断分布。

例子:

import numpy
import scipy.interpolate
import random
import matplotlib.pyplot as pyplot

# create some normally distributed values and make a histogram
a = numpy.random.normal(size=10000)
counts, bins = numpy.histogram(a, bins=100, density=True)
cum_counts = numpy.cumsum(counts)
bin_widths = (bins[1:] - bins[:-1])

# generate more values with same distribution
x = cum_counts*bin_widths
y = bins[1:]
inverse_density_function = scipy.interpolate.interp1d(x, y)
b = numpy.zeros(10000)
for i in range(len( b )):
u = random.uniform( x[0], x[-1] )
b[i] = inverse_density_function( u )

# plot both
pyplot.hist(a, 100)
pyplot.hist(b, 100)
pyplot.show()

这不会处理尾部,它可以更好地处理 bin 边缘,但它会让您开始使用直方图生成更多具有相同分布的值。

附言您也可以尝试拟合由一些值描述的特定已知分布(我认为这是您在问题中提到的),但上述非参数方法更通用。

关于python - python中直方图的概率密度函数以拟合另一个直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com