首页 文章

概率密度函数numpy histogram / scipy stats

提问于
浏览
2

我们有数组 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])

我想知道为什么 .

Update :我想提出一个更一般的问题 . 如何在不使用 numpy.histogram for density=True 的情况下获得数组的概率密度函数?

3 回答

  • 0

    如果density = True,则结果是bin处的概率密度函数的值,进行归一化,使得范围内的积分为1 .

    “标准化”并不意味着它将使用正态分布进行转换 . 它只是说bin中的每个值将除以条目的总数,以便总密度等于1 .

  • 1

    出于以下示例原因,您无法比较 numpy.histogram()scipy.stats.norm()

    scipy.stats.norm()是一个正常的连续随机变量,而numpy.histogram()处理序列(不连续)

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

相关问题