gpt4 book ai didi

python - 将对数正态分布的拟合 PDF 缩放为 python 中的直方图

转载 作者:行者123 更新时间:2023-11-28 21:48:42 25 4
gpt4 key购买 nike

我有一个对数正态分布样本集,想对其进行拟合。然后我想将样本的直方图和拟合的 PDF 绘制到一个图中,并且我想对直方图使用原始缩放比例。

我的问题:如何直接缩放 PDF 以使其在直方图中可见?

代码如下:

import numpy as np
import scipy.stats

# generate log-normal distributed set of samples
samples = np.random.lognormal( mean=1., sigma=.4, size=10000 )

# make a fit to the samples and generate the resulting PDF
shape, loc, scale = scipy.stats.lognorm.fit( samples, floc=0 )
x_fit = np.linspace( samples.min(), samples.max(), 100 )
samples_fit = scipy.stats.lognorm.pdf( x_fit, shape, loc=loc, scale=scale )

而且,为了更好地理解我的意思,请看下图: Left: Samples. Middle: histogram and fitted PDF. Right: normalized histogram and fitted PDF

我的问题是,是否有一个参数可以轻松地将 PDF 缩放为直方图(我没有找到一个,但这并不意味着太多......),以便 PDF 在中间图中可见?

最佳答案

您要的是预期直方图。

假设 [a, b] 是直方图的 x 区间之一。对于随机大小为n的样本,期望区间内的样本数为

(cdf(b) - cdf(a))*n

其中 cdf(x) 是累积分布函数。要绘制预期直方图,您需要为每个 bin 计算该值。

下面的脚本展示了一种绘制预期直方图的方法在 matplotlib 直方图之上。它生成此图:

histogram plot

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


# Generate log-normal distributed set of samples
np.random.seed(1234)
samples = np.random.lognormal(mean=1., sigma=.4, size=10000)

# Make a fit to the samples.
shape, loc, scale = scipy.stats.lognorm.fit(samples, floc=0)

# Create the histogram plot using matplotlib. The first two values in
# the tuple returned by hist are the number of samples in each bin and
# the values of the histogram's bin edges. counts has length num_bins,
# and edges has length num_bins + 1.
num_bins = 50
clr = '#FFE090'
counts, edges, patches = plt.hist(samples, bins=num_bins, color=clr, label='Sample histogram')

# Create an array of length num_bins containing the center of each bin.
centers = 0.5*(edges[:-1] + edges[1:])

# Compute the CDF at the edges. Then prob, the array of differences,
# is the probability of a sample being in the corresponding bin.
cdf = scipy.stats.lognorm.cdf(edges, shape, loc=loc, scale=scale)
prob = np.diff(cdf)

plt.plot(centers, samples.size*prob, 'k-', linewidth=2, label='Expected histogram')

# prob can also be approximated using the PDF at the centers multiplied
# by the width of the bin:
# p = scipy.stats.lognorm.pdf(centers, shape, loc=loc, scale=scale)
# prob = p*(edges[1] - edges[0])
# plt.plot(centers, samples.size*prob, 'r')

plt.legend()

plt.show()

注意:由于 PDF 是 CDF 的导数,您可以将 cdf(b) - cdf(a) 的近似写为

cdf(b) - cdf(a) = pdf(m)*(b - a)

其中 m 是区间 [a, b] 的中点。然后,您提出的确切问题的答案是通过将 PDF 乘以样本大小和直方图 bin 宽度来缩放 PDF。脚本中有一些注释掉的代码显示了如何使用缩放后的 PDF 绘制预期的直方图。但由于 CDF 也可用于对数正态分布,您不妨使用它。

关于python - 将对数正态分布的拟合 PDF 缩放为 python 中的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34893615/

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