- 在機率密度直方圖中,取到任一bin中的一個樣本的平均機率,等于該箱的高度(縱坐标y值) × 寬度(橫坐标間距δx) ÷ 該箱中樣本個數(n_samples),而不是等于縱坐标y值;即此時面積表示機率之和,而不是縱坐标y值表示單一樣本機率;如圖1、圖2所示。
- 在累積分布直方圖中,取到任一bin中的一個樣本的平均機率,等于(該箱的高度(縱坐标y值) -左側箱的高度)/ 該箱中樣本個數;即此時縱坐标y值表示機率,但為累計機率;如圖3、圖4所示。
- 當箱的個數等于樣本總數,即每個箱中隻有一個樣本時,取到任意一個樣本的機率,在機率密度直方圖中,等于該箱的高度 × 寬度;在累積分布直方圖中,等于該箱的高度-左側箱的高度。此時累積分布直方圖趨近于累計分布函數(CDF),但機率密度直方圖中各箱頂點的連線通常并不趨近于機率密度函數(PDF),因為在各個橫坐标處,也就是樣本的取值處,通常會存在離群的樣本取值機率,也就是離群的縱坐标值;隻有對該直方圖取一定程度的平滑曲線,才趨近于機率密度函數;如圖5、圖6所示。
圖1 bins=4的機率密度直方圖

圖2 bins=40的機率密度直方圖
圖3 bins=4的累積分布直方圖
圖4 bins=40的累積分布直方圖
圖5 bins等于樣本總數時的機率密度直方圖
圖6 bins等于樣本總數時的累積分布直方圖
- 下面是繪圖的代碼:
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()