python-3.x - 如何计算直方图的标准差?(Python,Matplotlib)
问题描述
假设我有一个数据集并使用 matplotlib 绘制所述数据集的直方图。
n, bins, patches = plt.hist(data, normed=1)
如何使用返回的n
和bins
值计算标准偏差hist()
?我目前正在这样做来计算平均值:
s = 0
for i in range(len(n)):
s += n[i] * ((bins[i] + bins[i+1]) / 2)
mean = s / numpy.sum(n)
这似乎工作正常,因为我得到了非常准确的结果。但是,如果我尝试像这样计算标准偏差:
t = 0
for i in range(len(n)):
t += (bins[i] - mean)**2
std = np.sqrt(t / numpy.sum(n))
我的结果与numpy.std(data)
返回的结果相去甚远。用每个 bin 的中心点替换左侧 bin 限制也不会改变这一点。我觉得问题在于n
andbins
值实际上并不包含任何关于各个数据点如何在每个 bin 中分布的信息,但是我正在处理的任务明确要求我使用它们来计算标准偏差.
解决方案
您没有使用 加权每个 bin 的贡献n[i]
。将增量更改t
为
t += n[i]*(bins[i] - mean)**2
numpy.average
顺便说一句,您可以通过使用withweights
参数来简化(并加快)您的计算。
这是一个例子。首先,生成一些数据来处理。在计算直方图之前,我们将计算输入的样本均值、方差和标准差。
In [54]: x = np.random.normal(loc=10, scale=2, size=1000)
In [55]: x.mean()
Out[55]: 9.9760798903061847
In [56]: x.var()
Out[56]: 3.7673459904902025
In [57]: x.std()
Out[57]: 1.9409652213499866
我将用于numpy.histogram
计算直方图:
In [58]: n, bins = np.histogram(x)
mids
是箱的中点;它的长度与n
:
In [59]: mids = 0.5*(bins[1:] + bins[:-1])
均值的估计是 的加权平均值mids
:
In [60]: mean = np.average(mids, weights=n)
In [61]: mean
Out[61]: 9.9763028267760312
在这种情况下,它非常接近原始数据的平均值。
估计方差是与平均值的平方差的加权平均值:
In [62]: var = np.average((mids - mean)**2, weights=n)
In [63]: var
Out[63]: 3.8715035807387328
In [64]: np.sqrt(var)
Out[64]: 1.9676136767004677
该估计值在实际样本标准偏差的 2% 以内。
推荐阅读
- c - 在 bin 排序算法中获取 malloc 断言错误
- visual-studio-code - 如何将 Visual Studio Code 中的面板移动到象限?
- apache-camel - 聚合apache骆驼中的optimisticLocking是什么意思?
- html - HTML 表单中的选择和复选框值是否支持非拉丁字符?
- azure - Azure 应用服务中的证书排除路径
- node.js - 如何强制将此图像转换为同步模式?
- python - 如何使用 Python Pandas 比较两个不同大小的数据集?
- c# - 停止 FileSystemWatcher 后运行另一段代码
- python - dockerised python解释器抱怨在docker中绑定安装源时缺少包
- json - 添加条件以将 ID 与 JSON 匹配