pylab.hist(data,normed = 1).规范化似乎不正确

smi*_*ffs 42 python numpy graph matplotlib

我正在尝试使用参数normed = 1创建直方图

例如:

import pylab

data = ([1,1,2,3,3,3,3,3,4,5.1])    
pylab.hist(data, normed=1)
pylab.show()
Run Code Online (Sandbox Code Playgroud)

我预计这些垃圾箱的总和将是1.但是,其中一个垃圾箱大于1.这个标准化做了什么?如何创建一个直方图,直方图的积分等于1?

在此输入图像描述

Car*_*nig 49

请参阅我的另一篇文章,了解如何使直方图中所有二进制数的总和等于一:https: //stackoverflow.com/a/16399202/1542814

复制粘贴:

weights = np.ones_like(myarray)/float(len(myarray))
plt.hist(myarray, weights=weights)
Run Code Online (Sandbox Code Playgroud)

myarray包含您的数据

  • 仅供参考,如果您使用上述方法,请务必保留`normed = 0`. (8认同)

eat*_*eat 24

根据文档 normed:如果为True,则结果是bin处的概率密度函数的值,进行归一化,使得范围内的积分为1.请注意,直方图值的总和将不等于1,除非bin选择统一宽度; 它不是概率质量函数.这是来自numpy doc,但对于pylab应该是相同的.

In []: data= array([1,1,2,3,3,3,3,3,4,5.1])
In []: counts, bins= histogram(data, normed= True)
In []: counts
Out[]: array([ 0.488,  0.,  0.244,  0.,  1.22,  0.,  0.,  0.244,  0.,  0.244])
In []: sum(counts* diff(bins))
Out[]: 0.99999999999999989
Run Code Online (Sandbox Code Playgroud)

因此,根据以下文档进行简单规范化:

In []: counts, bins= histogram(data, normed= False)
In []: counts
Out[]: array([2, 0, 1, 0, 5, 0, 0, 1, 0, 1])
In []: counts_n= counts/ sum(counts* diff(bins))
In []: counts_n
Out[]: array([ 0.488,  0.,  0.244,  0.,  1.22 ,  0.,  0.,  0.244,  0.,  0.244])
Run Code Online (Sandbox Code Playgroud)

  • 只要整数范围内的*积分*(不是和)等于1,概率*密度*可以是任何非负的. (13认同)
  • @eat标准化直方图,据我所知,是一个概率密度函数.概率不能超过1. (4认同)
  • @smirnoffs:你的论点是什么,它不能高于1?谢谢 (3认同)
  • 这个答案指的是numpy.histogram,而不是pylab.hist (3认同)

jua*_*nza 8

我认为你的bin高度与bin内容相混淆.您需要添加每个bin的内容,即所有bin的height*width.应该= 1.


alt*_*are 6

这种规范化做了什么?

为了标准化序列,您必须考虑bin大小.根据文档,bin的默认数量为10.因此,bin大小(data.max() - data.min() )/10为0.41.如果normed=1,那么条形的高度是这样的,总和乘以0.41,得到1.这是你整合时发生的事情.

如何创建一个直方图,直方图的积分等于1?

我想你想要直方图的总和,而不是它的积分,等于1.在这种情况下,最快的方式似乎是:

h = plt.hist(data)
norm = sum(data)
h2 = [i/norm for i in h[0]]
plt.bar(h[1],h2)
Run Code Online (Sandbox Code Playgroud)


Ore*_*lis 5

我遇到了同样的问题,在解决问题时又出现了另一个问题:如何将标准化的bin频率绘制为百分比,并在舍入值上打勾.我在这里发布它,以防它对任何人都有用.在我的例子中,我选择10%(0.1)作为y轴的最大值,10步(一个从0%到1%,一个从1%到2%,依此类推).关键是要设定在蜱数据计数(其是输出列表nplt.hist)下一个将被转换成使用百分比FuncFormatter类.这是我做的:

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

fig, ax = plt.subplots()

# The required parameters
num_steps = 10
max_percentage = 0.1
num_bins = 40

# Calculating the maximum value on the y axis and the yticks
max_val = max_percentage * len(data)
step_size = max_val / num_steps
yticks = [ x * step_size for x in range(0, num_steps+1) ]
ax.set_yticks( yticks )
plt.ylim(0, max_val)

# Running the histogram method
n, bins, patches = plt.hist(data, num_bins)

# To plot correct percentages in the y axis     
to_percentage = lambda y, pos: str(round( ( y / float(len(data)) ) * 100.0, 2)) + '%'
plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percentage))

plt.show()
Run Code Online (Sandbox Code Playgroud)

地块

在归一化之前:y轴单位是x轴中的bin间隔内的样本数: 在归一化之前:y轴单位是x轴中的bin间隔内的样本数

归一化后:y轴单位是箱值的频率,作为所有样本的百分比 归一化后:y轴单位是箱值的频率,作为所有样本的百分比