7

如何创建一个直方图,显示给定数字 x 范围从 0-1 的数组的概率分布?我希望每个条形图都 <= 1,并且如果我将每个条形图的 y 值相加,它们应该加起来为 1。

例如,如果 x=[.2, .2, .8] 那么我会期望显示 2 个条形图,一个在 0.2 处高度为 0.66,一个在 0.8 处高度为 0.33。

我试过了:

matplotlib.pyplot.hist(x, bins=50, normed=True)

这给了我一个柱状图超过 1 的直方图。我并不是说这是错误的,因为根据文档,这是规范参数将执行的操作,但这并没有显示概率。

我也试过:

counts, bins = numpy.histogram(x, bins=50, density=True)
bins = bins[:-1] + (bins[1] - bins[0])/2
matplotlib.pyplot.bar(bins, counts, 1.0/50)

这也给了我 y 值总和大于 1 的条形图。

4

2 回答 2

6

我认为我原来的术语是错误的。我有一个连续值数组 [0-1),我想对其进行离散化并用于绘制概率质量函数。我认为这可能很常见,足以保证使用一种方法来做到这一点。

这是代码:

x = [random.random() for r in xrange(1000)]
num_bins = 50
counts, bins = np.histogram(x, bins=num_bins)
bins = bins[:-1] + (bins[1] - bins[0])/2
probs = counts/float(counts.sum())
print probs.sum() # 1.0
plt.bar(bins, probs, 1.0/num_bins)
plt.show()
于 2013-10-23T00:27:07.503 回答
3

我认为您将sum误认为是integer。一个适当的 PDF(概率分布函数)集成为一;如果你只取总和,你可能会错过矩形的大小。

import numpy as np
import pylab as plt

N = 10**5
X = np.random.normal(size=N)

counts, bins = np.histogram(X,bins=50, density=True)
bins = bins[:-1] + (bins[1] - bins[0])/2

print np.trapz(counts, bins)

Gives .999985,它足够接近统一。

编辑:回应以下评论:

如果 x=[.2, .2, .8] 并且我正在寻找一个包含两个条形图的图表,一个在 0.2 处高度为 0.66,因为 66% 的值在 0.2 处,一个在 0.8 处高度 .33,该图将被称为什么以及如何生成它?

以下代码:

from collections import Counter
x = [.2,.2,.8]
C = Counter(x)
total = float(sum(C.values()))
for key in C: C[key] /= total

给出一个“字典” C=Counter({0.2: 0.666666, 0.8: 0.333333})。从这里可以构建一个条形图,但这仅在 PDF 是离散的并且仅采用彼此分离良好的有限固定值集时才有效。

于 2013-10-21T20:55:05.783 回答