首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用matplotlib绘制抽样概率密度函数

用matplotlib绘制抽样概率密度函数
EN

Stack Overflow用户
提问于 2013-03-15 00:53:28
回答 2查看 83.8K关注 0票数 26

我想根据我拥有的样本绘制概率密度函数的近似值,即模仿直方图行为的曲线。我想要多大的样品就有多大。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-15 01:01:44

如果您想绘制一个分布,并且您知道它,请将其定义为一个函数,并按如下方式绘制它:

代码语言:javascript
复制
import numpy as np
from matplotlib import pyplot as plt

def my_dist(x):
    return np.exp(-x ** 2)

x = np.arange(-100, 100)
p = my_dist(x)
plt.plot(x, p)
plt.show()

如果你没有精确的分布作为分析函数,也许你可以生成一个大样本,取一个直方图,然后以某种方式平滑数据:

代码语言:javascript
复制
import numpy as np
from scipy.interpolate import UnivariateSpline
from matplotlib import pyplot as plt

N = 1000
n = N//10
s = np.random.normal(size=N)   # generate your data sample with N elements
p, x = np.histogram(s, bins=n) # bin it into n = N//10 bins
x = x[:-1] + (x[1] - x[0])/2   # convert bin edges to centers
f = UnivariateSpline(x, p, s=n)
plt.plot(x, f(x))
plt.show()

可以在UnivariateSpline函数调用中增加或减少s (平滑因子)以增加或减少平滑。例如,使用这两个命令可以获得以下结果:

票数 38
EN

Stack Overflow用户

发布于 2013-03-15 03:39:20

您需要做的是使用scipy.stats.kde包中的gaussian_kde。

根据您的数据,您可以执行以下操作:

代码语言:javascript
复制
from scipy.stats.kde import gaussian_kde
from numpy import linspace
# create fake data
data = randn(1000)
# this create the kernel, given an array it will estimate the probability over that values
kde = gaussian_kde( data )
# these are the values over wich your kernel will be evaluated
dist_space = linspace( min(data), max(data), 100 )
# plot the results
plt.plot( dist_space, kde(dist_space) )

内核密度可以任意配置,可以轻松处理N维数据。它还可以避免你在askewchan给出的图中看到的样条线扭曲。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15415455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档