Python 用matplotlib按样本绘制概率密度函数

Python 用matplotlib按样本绘制概率密度函数,python,matplotlib,histogram,probability,Python,Matplotlib,Histogram,Probability,我想画一个概率密度函数的近似值,基于 我有一个样品;模拟直方图行为的曲线。我可以 有我想要的大样本。如果您想要绘制分布,并且您知道它,请将其定义为函数,并按如下方式绘制: 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

我想画一个概率密度函数的近似值,基于 我有一个样品;模拟直方图行为的曲线。我可以
有我想要的大样本。

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

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()

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

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
(平滑因子),以增加或减少平滑。例如,使用以下两种方法:

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

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

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给出的图中可以看到的样条线失真


您的样品是什么?这是分布还是实际数据?我不明白怎么会有人投票否决这个问题?!我的意思是基于什么???通常人们会投票的问题是立即明确,也显示出一些试图回答自己的问题。“你尝试过什么?”通常反对票都会伴随着评论,所以我不知道为什么在这种情况下没有发生。我明白了。谢谢你的解释。。。有时候这些事情让我觉得民主很糟糕!嘿,是的。在概述人们在一个问题中的期望(和不期望)时,这些选项非常有用。除了“声誉”之外,更多的投票会让你的问题更引人注目,更受关注。这对我的情况没有帮助。我已经写了我的采样函数,它不精确的样本大小一让说!那么我认为你应该把你的问题修改得更清楚。这回答了您的问题,假设您“拥有分布”。谢谢。但是我得到了以下错误:raise VALUERROR(“x和y数组沿插值轴的长度必须相等”VALUERROR:x和y数组沿插值轴的长度必须相等。@Naji很抱歉,现在应该可以工作了,有一个正态分布的工作示例。我仍然得到以下错误:f=UnivariateSpline(x,0.5,s=200)文件“/Library/Python/2.7/site packages/scipy/interpolate/fitpack2.py”,第143行,在init xb=bbox[0],xe=bbox[1],s=s中)dfitpack.error:未能将dfitpack.fpcurf0的第二个参数“y”转换为C/Fortran Array。我正在寻找类似的解决方案。我已经有一个数据集,但我不知道它有什么分布,所以我正在尝试使用python绘制概率分布函数,但我碰巧不知道如何绘制。在t“礼盒”。@SitzBlogz假设您的数据集名为
data
,然后只需删除@EnricoGiampieri answer中的
data=randn(1000)
,您就完成了!