为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2022-08-16 17:44:50
我试图做的是玩一些随机分布。我不希望它变得正常。但就目前而言,正常更容易。import matplotlib.pyplot as pltfrom scipy.stats import normws=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()然后,我能做的就是根据点数来可视化CDF。density1=unity_density.cumsum()x=bins[:-1]y=density1plt.plot(x, density1, 'o')因此,我一直试图做的是在np.直方图的输出上使用np.interp函数,以获得表示CDF的平滑曲线并提取百分点以绘制它们。理想情况下,我需要尝试手动完成所有操作并使用scipy中的ppf函数。作为一名本科生,我一直在与统计学作斗争。我现在在读研究生,并试图让我尽可能多地进行这样的练习,以便更深入地了解正在发生的事情。我对这项任务已经到了绝望的地步。谢谢!
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

获得更平滑结果的一种可能性是使用更多样本,通过使用,我得到以下图像:10^5 samples100 bins


ws = norm.rvs(loc=4.0, scale=1.5, size=100000)

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

//img1.sycdn.imooc.com//62fb67670001f22e06510230.jpg

通常,您可以使用 scipys 插值模块来平滑 CDF。对于和平滑因子我得到:100 sampless=0.01


import numpy as np

import matplotlib.pyplot as plt

from scipy.interpolate import splev, splrep


density1 = unity_density.cumsum()

x = bins[:-1]

y = density1


# Interpolation

spl = splrep(x, y, s=0.01, per=False)

x2 = np.linspace(x[0], x[-1], 200)

y2 = splev(x2, spl)


# Plotting

fig, ax = plt.subplots()

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

plt.plot(x2, y2, 'r-')

//img1.sycdn.imooc.com//62fb67720001798b05430408.jpg

第三种可能性是分析计算CDF。如果你自己用一个/函数生成噪音,大多数时候已经有可用的实现,否则你应该在维基百科上找到它。如果您的样品来自测量值,那当然是另一回事。numpyscipyCDF


import numpy as np

from scipy.stats import norm

import matplotlib.pyplot as plt


fig, ax = plt.subplots()

x = np.linspace(-2, 10)

y = norm(loc=4.0, scale=1.5).cdf(x)

ax.plot(x, y, 'bo-')

//img1.sycdn.imooc.com//62fb677d0001833005430409.jpg

查看完整回答
反对 回复 2022-08-16
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信