我们有数组a=range(10)
。使用numpy.histogram
:
hist,bins=numpy.histogram(a,bins=(np.max(a)-np.min(a))/1, range=np.min(a),np.max(a)),density=True)
根据numpy教程:
如果density = True,则结果是bin处的概率密度函数的值,进行归一化,使得该范围内的积分为1.
结果是:
array([ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2])
我尝试使用scipy.stats
:
mean = np.mean(a)
sigma = np.std(a)
norm.pdf(a, mean, sigma)
但结果却不同:
array([ 0.04070852, 0.06610774, 0.09509936, 0.12118842, 0.13680528,0.13680528, 0.12118842, 0.09509936, 0.06610774, 0.04070852])
我想知道原因。
更新:我想提出一个更一般的问题。如何在不使用numpy.histogram
的{{1}}的情况下获得数组的概率密度函数?
答案 0 :(得分:1)
如果density = True,则结果是概率密度的值 功能在bin,规范化这样积分超过 范围是1。
"标准化"并不意味着它将使用正态分布进行转换。它只是说bin中的每个值都将除以条目总数,这样总密度就等于1.
答案 1 :(得分:0)
由于以下原因,您无法与numpy.histogram()
和scipy.stats.norm()
进行比较:
scipy.stats.norm()是一个正常的连续随机变量,而numpy.histogram()处理序列(不连续)
答案 2 :(得分:0)
从直方图绘制连续概率函数(PDF) - 用Python解决。请参阅此博客以获取详细说明。 (http://howdoudoittheeasiestway.blogspot.com/2017/09/plotting-continuous-probability.html)否则,您可以使用以下代码。
n, bins, patches = plt.hist(A, 40, histtype='bar')
plt.show()
n = n/len(A)
n = np.append(n, 0)
mu = np.mean(n)
sigma = np.std(n)
plt.bar(bins,n, width=(bins[len(bins)-1]-bins[0])/40)
y1= (1/(sigma*np.sqrt(2*np.pi))*np.exp(-(bins - mu)**2 /(2*sigma**2)))*0.03
plt.plot(bins, y1, 'r--', linewidth=2)
plt.show()