Gumbel distribution


感覺這個分布的含義很有用啊, 能預測‘最大', 也就是自然災害, 太牛了.

主要內容

定義

[Gumbel distribution-wiki](Gumbel distribution - Wikipedia)

其分布函數和概率密度函數分別為:

\[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]} \]

標准Gumbel分布(即\(\mu=0, \beta=1\)):

\[F(x) = e^{-e^{-x}}, \quad f(x) = e^{-(x+e^{-x})}. \]

從Gumbel分布中采樣, 只需:

\[x = F^{-1}(u) = \mu - \beta \ln (-\ln(u)), \quad u \sim \mathrm{Uniform}(0, 1). \]

proof:

\[P(F^{-1}(u) \le x) = P(u \le F(x)) = F(x), \]

\(F^{-1}(u)\)的分布函數就是\(F(x)\).

\[\mathbb{E} [x] = \mu + \gamma \cdot \beta, \]

其中 \(\gamma\)是Euler-Mascherorni constant.

Gumbel-Max trick

假設我們有一個離散的分布\([\pi_1, \pi_2, \cdots, \pi_k]\)\(k\)類, \(\pi_i\)表示為第\(i\)類的概率, 則從該分布中采樣\(z\)等價於

\[z = \arg \max_i [g_i + \log \pi_i], \quad g_i \sim \mathrm{Gumbel}(0, 1), \mathrm{i.i.d}. \]

proof:

\[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(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}}, \]

帶入計算得:

\[\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} \]

Gumbel trick 用於歸一化

我們時常會碰到這樣的問題:

\[p(x;\theta) = \frac{f(x;\theta)}{Z}, \]

其中\(Z=\sum_{i=1}^K f(x_i;\theta)\) 是歸一化常數, 那么怎么計算\(Z\)呢?

構建隨機變量\(T\):

\[T = \max_i [\ln f(x_i) + g_i], \quad g_i \sim \mathrm{Gumbel}(-c, 1), \mathrm{i.i.d.} \]

\[T \sim \mathrm{Gumbel}(-c + \ln Z) \]

proof:

\[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). \]

因為

\[\mathbb{E}[T] = -c + \ln Z + \gamma, \]

故我們只需估計\(\mathbb{E}[T] \approx \sum_j T_j\) 即可估計\(Z\)

\[Z = \exp (\sum_{j}T_j + c - \gamma). \]

所以必須要求離散的\(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()

image-20210526174047331


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM