概
感觉这个分布的含义很有用啊, 能预测‘最大’, 也就是自然灾害, 太牛了.
主要内容
定义
[Gumbel distribution-wiki](Gumbel distribution - Wikipedia)
其分布函数和概率密度函数分别为:
F
(
x
;
μ
,
β
)
=
e
−
e
−
(
x
−
μ
)
/
β
,
f
(
x
;
μ
,
β
)
=
1
β
e
−
[
e
−
(
x
−
μ
)
/
β
+
(
x
−
μ
)
/
β
]
F(x; \mu, \beta) = e^{-e^{-(x-\mu)/\beta}}, \quad f(x;\mu,\beta) = \frac{1}{\beta} e^{-[e^{-(x-\mu)/\beta}+(x-\mu) / \beta]}
F(x;μ,β)=e−e−(x−μ)/β,f(x;μ,β)=β1e−[e−(x−μ)/β+(x−μ)/β]
标准Gumbel分布(即
μ
=
0
,
β
=
1
\mu=0, \beta=1
μ=0,β=1):
F
(
x
)
=
e
−
e
−
x
,
f
(
x
)
=
e
−
(
x
+
e
−
x
)
.
F(x) = e^{-e^{-x}}, \quad f(x) = e^{-(x+e^{-x})}.
F(x)=e−e−x,f(x)=e−(x+e−x).
从Gumbel分布中采样, 只需:
x
=
F
−
1
(
u
)
=
μ
−
β
ln
(
−
ln
(
u
)
)
,
u
∼
U
n
i
f
o
r
m
(
0
,
1
)
.
x = F^{-1}(u) = \mu - \beta \ln (-\ln(u)), \quad u \sim \mathrm{Uniform}(0, 1).
x=F−1(u)=μ−βln(−ln(u)),u∼Uniform(0,1).
proof:
P
(
F
−
1
(
u
)
≤
x
)
=
P
(
u
≤
F
(
x
)
)
=
F
(
x
)
,
P(F^{-1}(u) \le x) = P(u \le F(x)) = F(x),
P(F−1(u)≤x)=P(u≤F(x))=F(x),
故
F
−
1
(
u
)
F^{-1}(u)
F−1(u)的分布函数就是
F
(
x
)
F(x)
F(x).
E [ x ] = μ + γ ⋅ β , \mathbb{E} [x] = \mu + \gamma \cdot \beta, E[x]=μ+γ⋅β,
其中 γ \gamma γ是Euler-Mascherorni constant.
Gumbel-Max trick
假设我们有一个离散的分布
[
π
1
,
π
2
,
⋯
,
π
k
]
[\pi_1, \pi_2, \cdots, \pi_k]
[π1,π2,⋯,πk]共
k
k
k类,
π
i
\pi_i
πi表示为第
i
i
i类的概率, 则从该分布中采样
z
z
z等价于
z
=
arg
max
i
[
g
i
+
log
π
i
]
,
g
i
∼
G
u
m
b
e
l
(
0
,
1
)
,
i
.
i
.
d
.
z = \arg \max_i [g_i + \log \pi_i], \quad g_i \sim \mathrm{Gumbel}(0, 1), \mathrm{i.i.d}.
z=argimax[gi+logπi],gi∼Gumbel(0,1),i.i.d.
proof:
P
(
z
=
i
)
=
P
(
g
i
+
log
π
i
≥
max
{
g
j
+
log
π
j
}
j
≠
i
)
=
∫
−
∞
+
∞
p
(
x
)
P
(
x
+
log
π
i
≥
{
g
j
+
log
π
j
}
j
≠
i
)
d
x
.
P(z=i) = P(g_i + \log \pi_i \ge \max \{g_j + \log \pi_j\}_{j\not=i}) = \int_{-\infty}^{+\infty} p(x) P(x+\log \pi_i \ge \{g_j + \log \pi_j\}_{j\not=i}) \mathrm{d}x.
P(z=i)=P(gi+logπi≥max{gj+logπj}j=i)=∫−∞+∞p(x)P(x+logπi≥{gj+logπj}j=i)dx.
又
P
(
x
+
log
π
i
≥
{
g
j
+
log
π
j
}
j
≠
i
)
=
∏
j
≠
i
P
(
g
j
≤
x
+
log
π
i
−
log
π
j
)
=
e
−
e
−
x
⋅
1
−
π
i
π
i
,
P(x+\log \pi_i \ge \{g_j + \log \pi_j\}_{j\not=i}) = \prod_{j\not=i} P(g_j \le x + \log\pi_i - \log \pi_j) = e^{-e^{-x} \cdot \frac{1 - \pi_i}{\pi_i}},
P(x+logπi≥{gj+logπj}j=i)=j=i∏P(gj≤x+logπi−logπj)=e−e−x⋅πi1−πi,
带入计算得:
P ( z = i ) = ∫ − ∞ + ∞ e − ( x + e − x ⋅ 1 π i ) d x = ∫ − ∞ + ∞ π i ⋅ e − [ ( x − log 1 π i ) + e − ( x − log 1 π i ) ] d x = π i . \begin{array}{ll} P(z=i) & = \int_{-\infty}^{+\infty} e^{-(x+e^{-x} \cdot \frac{1}{\pi_i})} \mathrm{d}x \\ & = \int_{-\infty}^{+\infty} \pi_i \cdot e^{-[(x-\log\frac{1}{\pi_i})+e^{-(x - \log \frac{1}{\pi_i})}]} \mathrm{d}x \\ & = \pi_i. \end{array} P(z=i)=∫−∞+∞e−(x+e−x⋅πi1)dx=∫−∞+∞πi⋅e−[(x−logπi1)+e−(x−logπi1)]dx=πi.
Gumbel trick 用于归一化
我们时常会碰到这样的问题:
p
(
x
;
θ
)
=
f
(
x
;
θ
)
Z
,
p(x;\theta) = \frac{f(x;\theta)}{Z},
p(x;θ)=Zf(x;θ),
其中
Z
=
∑
i
=
1
K
f
(
x
i
;
θ
)
Z=\sum_{i=1}^K f(x_i;\theta)
Z=∑i=1Kf(xi;θ) 是归一化常数, 那么怎么计算
Z
Z
Z呢?
构建随机变量
T
T
T:
T
=
max
i
[
ln
f
(
x
i
)
+
g
i
]
,
g
i
∼
G
u
m
b
e
l
(
−
c
,
1
)
,
i
.
i
.
d
.
T = \max_i [\ln f(x_i) + g_i], \quad g_i \sim \mathrm{Gumbel}(-c, 1), \mathrm{i.i.d.}
T=imax[lnf(xi)+gi],gi∼Gumbel(−c,1),i.i.d.
则
T
∼
G
u
m
b
e
l
(
−
c
+
ln
Z
)
T \sim \mathrm{Gumbel}(-c + \ln Z)
T∼Gumbel(−c+lnZ)
proof:
P ( T ≤ t ) = P ( max i [ ln f ( x i ) + g i ] ≤ t ) = ∏ i P ( g i ≤ t − ln f ( x i ) ) = e − e − ( t + c − ln Z ) = F ( t ; − c + ln Z , 1 ) . P(T \le t) = P(\max_i [\ln f(x_i) + g_i] \le t) = \prod_{i} P(g_i \le t - \ln f(x_i)) = e^{-e^{-(t+c-\ln Z)}} = F(t;-c+\ln Z ,1). P(T≤t)=P(imax[lnf(xi)+gi]≤t)=i∏P(gi≤t−lnf(xi))=e−e−(t+c−lnZ)=F(t;−c+lnZ,1).
因为
E
[
T
]
=
−
c
+
ln
Z
+
γ
,
\mathbb{E}[T] = -c + \ln Z + \gamma,
E[T]=−c+lnZ+γ,
故我们只需估计
E
[
T
]
≈
∑
j
T
j
\mathbb{E}[T] \approx \sum_j T_j
E[T]≈∑jTj 即可估计
Z
Z
Z
Z
=
exp
(
∑
j
T
j
+
c
−
γ
)
.
Z = \exp (\sum_{j}T_j + c - \gamma).
Z=exp(j∑Tj+c−γ).
所以必须要求离散的
x
x
x?
代码
[scipy-gumbel](scipy.stats.gumbel_r — SciPy v1.6.3 Reference Guide)
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gumbel_r
fig, ax = plt.subplots(1, 1)
# mean, var, skew, kurt = gumbel_r.stats(moments='mvsk')
# print(mean, var, skew, kurt)
x = np.linspace(gumbel_r.ppf(0.01), gumbel_r.ppf(0.99), 100)
ax.plot(x, gumbel_r.pdf(x), 'r-', lw=5, alpha=0.6, label="gumbel_r pdf")
r = gumbel_r.rvs(size=1000, loc=0, scale=1)
ax.hist(r, density=True, histtype="stepfilled", alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.show()