Matplotlib hist函数中Normed参数的问题
在使用Matplotlib库中的pylab.hist()函数进行数据统计展示时,常常会调用该函数的normed参数进行数据归一化操作,但是有些文献中会将其称为density参数,从而引起一些混淆。本文将介绍使用normed参数进行归一化的方法,以及可能出现的问题及解决方法。
阅读更多:Matplotlib 教程
normed参数的用法
normed参数是在pylab.hist函数中进行数据归一化的重要参数,当normed参数值为1,即normed=True时,对数据进行归一化使其值域在0-1之间,这就意味着,实际数值除以区间长度,输出的面积之和等于1。例如,我们有以下样本数据:
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
使用pylab.hist()函数进行统计分析展示,不使用归一化的代码如下:
n, bins, patches = plt.hist(x, bins=50, density=False, alpha=0.5, color='r')
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram')
plt.show()
此时我们得到的图像并未对数据进行归一化处理,而对该数据进行normed参数为True的归一化处理,代码如下:
n, bins, patches = plt.hist(x, bins=50, density=True, alpha=0.5, color='r')
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram')
plt.show()
可以看到,在将normed参数设置为True时,数据被归一化并且纵轴区间变换为[0,1]。
normed参数的问题
在使用Matplotlib库绘制直方图时,使用normed参数进行归一化操作时,负值及正值之和可能会不等于1,这是因为将浮点数转换成二进制储存会出现精度误差,计算可能会产生一些不是我们预期的结果。例如,我们有以下样本数据:
x = [-1.2, -0.3, 0.5, 1.2, 2.5, 3.4, 4.5]
对其进行normed参数为True的归一化处理,代码如下:
plt.hist(x, bins=20, normed=True)
此时可以看到,如果我们假设统计的概率密度函数的积分是1,(即我们使用了normed=True)则在某个区间上,似乎积分总和是大于1或小于1了,这是因为浮点数精度误差导致的。这种情况下,我们应该使用bins参数来更好的控制直方图的表现。
解决方法
解决这个问题的一个方法是手动设置bins参数,以便使得直方图中的所有条的面积之和为1。例如,在上面的例子中,代码如下:
bins=[-1.2, -0.3, 0.5, 1.2, 2.5, 3.4, 4.5, 5.6]
plt.hist(x, bins=bins, normed=True)
这个时候,和应该符合预期,所有区间的积分都等于1。
总结
Matplotlib库中的pylab.hist()函数是一种方便的快速绘制直方图的方式,而normed参数则可以进行数据的归一化。但是在使用normed参数时,可能会出现负值及正值之和不等于1的问题,这是由于浮点数的精度误差导致的。解决这个问题的方法是手动设置bins参数,以便直方图中的所有条的面积之和为1。
极客教程