• 在概率密度直方图中,取到任一bin中的一个样本的平均概率,等于该箱的高度(纵坐标y值) × 宽度(横坐标间距δx) ÷ 该箱中样本个数(n_samples),而不是等于纵坐标y值;即此时面积表示概率之和,而不是纵坐标y值表示单一样本概率;如图1、图2所示。
  • 在累积分布直方图中,取到任一bin中的一个样本的平均概率,等于(该箱的高度(纵坐标y值) -左侧箱的高度)/ 该箱中样本个数;即此时纵坐标y值表示概率,但为累计概率;如图3、图4所示。
  • 当箱的个数等于样本总数,即每个箱中只有一个样本时,取到任意一个样本的概率,在概率密度直方图中,等于该箱的高度 × 宽度;在累积分布直方图中,等于该箱的高度-左侧箱的高度。此时累积分布直方图趋近于累计分布函数(CDF),但概率密度直方图中各箱顶点的连线通常并不趋近于概率密度函数(PDF),因为在各个横坐标处,也就是样本的取值处,通常会存在离群的样本取值概率,也就是离群的纵坐标值;只有对该直方图取一定程度的平滑曲线,才趋近于概率密度函数;如图5、图6所示。

图1 bins=4的概率密度直方图

概率密度直方图python实现 直方图 概率密度_概率密度直方图python实现


概率密度直方图python实现 直方图 概率密度_累积分布_02


图2 bins=40的概率密度直方图

概率密度直方图python实现 直方图 概率密度_概率密度_03


概率密度直方图python实现 直方图 概率密度_统计学_04


图3 bins=4的累积分布直方图

概率密度直方图python实现 直方图 概率密度_概率密度_05


概率密度直方图python实现 直方图 概率密度_直方图_06


图4 bins=40的累积分布直方图

概率密度直方图python实现 直方图 概率密度_累积分布_07


概率密度直方图python实现 直方图 概率密度_统计学_08


图5 bins等于样本总数时的概率密度直方图

概率密度直方图python实现 直方图 概率密度_累积分布_09


概率密度直方图python实现 直方图 概率密度_概率密度直方图python实现_10


图6 bins等于样本总数时的累积分布直方图

概率密度直方图python实现 直方图 概率密度_直方图_11


概率密度直方图python实现 直方图 概率密度_概率密度直方图python实现_12

  • 下面是绘图的代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression


X, y_origin = make_regression(n_samples=10000, noise=100, random_state=0)  # create data
y_scale = (y_origin + abs(y_origin.min())) / 200  # shift and shrink
y_exp = np.expm1(y_scale)  # exp(x) - 1
y_log = np.log1p(y_exp)  # log(1 + x)
print(sum(y_scale - y_log < 1e-10) == len(y_origin))  # y_log is equal to y_scale

n_samples = 2500  # each bin has n_samples, so there are len(y_origin) / n_samples bins.

f, (ax0, ax1) = plt.subplots(1, 2)
ax0.hist(y_origin, bins=int(len(y_origin)/n_samples), density=True, cumulative=True)
ax0.set_title('y_origin')
ax1.hist(y_scale, bins=int(len(y_scale)/n_samples), density=True, cumulative=True)
ax1.set_title('y_scale')
f.suptitle("Synthetic data", y=0.06, x=0.53)
f.tight_layout(rect=[0.05, 0.05, 0.95, 0.95])
plt.show()

f, (ax0, ax1) = plt.subplots(1, 2)
ax0.hist(y_exp, bins=int(len(y_exp)/n_samples), density=True, cumulative=True)
# ax0.set_xlim([-100, 1700])
ax0.set_title('y_exp')
ax1.hist(y_log, bins=int(len(y_log)/n_samples), density=True, cumulative=True)
ax1.set_title('y_log')
f.suptitle("Synthetic data", y=0.06, x=0.53)
f.tight_layout(rect=[0.05, 0.05, 0.95, 0.95])
plt.show()