我想基于我拥有的样本绘制概率密度函数的近似值,使曲线模仿直方图的行为。我可以有任意多的样本。
我想基于我拥有的样本绘制概率密度函数的近似值,使曲线模仿直方图的行为。我可以有任意多的样本。
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
(平滑因子)来增加或减少平滑度。例如,使用下面这两个:
n
是一个 int
,因为我在使用 Python 2,而且大多数读者可能也是如此。 - askewchan你需要做的是使用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提供的图中看到的样条畸变。
核密度可以随意配置,能够轻松处理N维数据,同时避免了由askewchan给出的图中看到的样条畸变。
data
,那么只需删除 @EnricoGiampieri 的答案中的一行 data = randn(1000)
,你就完成了! - Alessandro Jacopson