尝试在 Python 中插值直方图函数的输出

我试图做的是玩一些随机分布。我不希望它变得正常。但就目前而言,正常更容易。


import matplotlib.pyplot as plt

from scipy.stats import norm


ws=norm.rvs(4.0, 1.5, size=100)

density, bins = np.histogram(ws, 50,normed=True, density=True)

unity_density = density / density.sum()


fig, ((ax1, ax2)) = plt.subplots(nrows=1, ncols=2, sharex=True, figsize=(12,6))

widths = bins[:-1] - bins[1:]


ax1.bar(bins[1:], unity_density, width=widths)

ax2.bar(bins[1:], unity_density.cumsum(), width=widths)


fig.tight_layout()

http://img.mukewang.com/62fb67400001127312770635.jpg

然后,我能做的就是根据点数来可视化CDF。


density1=unity_density.cumsum()

x=bins[:-1]

y=density1


plt.plot(x, density1, 'o')

http://img1.mukewang.com/62fb674c0001973c06340414.jpg

因此,我一直试图做的是在np.直方图的输出上使用np.interp函数,以获得表示CDF的平滑曲线并提取百分点以绘制它们。理想情况下,我需要尝试手动完成所有操作并使用scipy中的ppf函数。作为一名本科生,我一直在与统计学作斗争。我现在在读研究生,并试图让我尽可能多地进行这样的练习,以便更深入地了解正在发生的事情。我对这项任务已经到了绝望的地步。谢谢!

倚天杖
浏览 136回答 1
1回答

皈依舞

获得更平滑结果的一种可能性是使用更多样本,通过使用,我得到以下图像:10^5 samples100 binsws = norm.rvs(loc=4.0, scale=1.5, size=100000)density, bins = np.histogram(ws, bins=100, normed=True, density=True)通常,您可以使用 scipys 插值模块来平滑 CDF。对于和平滑因子我得到:100 sampless=0.01import numpy as npimport matplotlib.pyplot as pltfrom scipy.interpolate import splev, splrepdensity1 = unity_density.cumsum()x = bins[:-1]y = density1# Interpolationspl = splrep(x, y, s=0.01, per=False)x2 = np.linspace(x[0], x[-1], 200)y2 = splev(x2, spl)# Plottingfig, ax = plt.subplots()plt.plot(x, density1, 'o')plt.plot(x2, y2, 'r-')第三种可能性是分析计算CDF。如果你自己用一个/函数生成噪音,大多数时候已经有可用的实现,否则你应该在维基百科上找到它。如果您的样品来自测量值,那当然是另一回事。numpyscipyCDFimport numpy as npfrom scipy.stats import normimport matplotlib.pyplot as pltfig, ax = plt.subplots()x = np.linspace(-2, 10)y = norm(loc=4.0, scale=1.5).cdf(x)ax.plot(x, y, 'bo-')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python