JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

機率積分變換

把任何連續變數送進它自己的累積分配函數,出來的竟是完美平坦的 Uniform(0, 1);再把這個過程倒著走,你就能用一個亂數製造出你想要的任何分配。一個小事實,兩個巨大的回報。

一個令人驚訝的攤平

在這個階段的第一篇裡,你學過 累積分配函數法:要找出某個隨機變數的函數的分配,就去追它的累積分配函數。這裡我們把同一套機器對準一個奇特的函數——而答案乾淨到像是變魔術。取任何連續隨機變數 X,它的 cdf 是 F,其中 F(x) = P(X <= x)。現在把 X 送進它「自己」的 cdf,定義一個全新的變數 U = F(X)。機率積分變換的論斷是:不論 X 原本是什麼,U 恰好就是 Uniform(0, 1)。一個極度偏斜的所得、一個鐘形的測量誤差、一個指數型的等待時間——把它們各自推過自己的 F,出來的都是 [0, 1] 上同一塊平坦的板子。

這到底為什麼會成立?證明只有短短兩行,而且它只仰賴 cdf 本來就是什麼。我們想要 U 的 cdf,也就是對介於 0 與 1 之間的 u 求 P(U <= u)。寫成 P(U <= u) = P(F(X) <= u)。因為 F 是遞增的,事件 F(X) <= u 與事件 X <= F^(-1)(u) 是同一個事件,其中 F^(-1) 是 F 的反函數(那個 cdf 恰好等於 u 的值)。所以 P(F(X) <= u) = P(X <= F^(-1)(u)) = F(F^(-1)(u)) = u。U 的 cdf 就是在 [0, 1] 上的 P(U <= u) = u——而一個 cdf 是直線 u 的變數,正正就是 標準均勻分配。完成。

為什麼這份平坦並非巧合

代數能證明它,但一張圖能告訴你它為什麼非如此不可。把 F(x) 想成對一個問題的回答:有多少比例的機率坐落在 x 之下(含 x)?當你算 U = F(X),你問的已不再是「X 落在它自己那條歪歪扭扭的軸上的哪裡?」,而是「X 落在第幾百分位?」而百分位,按其建構方式,本就是均勻鋪開的。依定義,最低的 10% 結果其 F 值介於 0 與 0.1 之間,接下來的 10% 介於 0.1 與 0.2 之間,以此類推——每一成的機率恰好佔據 [0, 1] 刻度上的一成。那份均勻的鋪開「就是」均勻性。

這樣看,F 就像一把尺,把原來的軸又拉又擠,直到機率被攤得平平的。X 堆得密的地方——比方說鐘形的尖峰附近——cdf 爬得陡,於是一大段機率被壓進一小段 u;X 稀疏的地方,也就是尾巴,F 爬得慢,把一小條薄薄的機率拉開到 [0, 1] 線上更長的範圍。所有這些拉與擠的淨效果,就是把那個坑坑巴巴的隨機變數熨成一個完全均勻的。百分位是偉大的拉平者。

倒著跑:用一個均勻變數造出任何分配

這個變換是一條可逆的路,而回程才是真正的威力所在。如果把 X 送進 F 會得到均勻,那麼把均勻送進 F^(-1) 就必然會還原出 X。從 U ~ Uniform(0, 1) 出發,令 X = F^(-1)(U)。那個 F^(-1),也就是把百分位變回數值的函數,正是你在階梯前段遇過的分位數函數。這個結果叫做反變換,它說:X = F^(-1)(U) 的 cdf 就是 F。換句話說——隨機挑一個百分位,查出那個百分位上的值,你就得到了一個服從 F 所描述的任何分配的樣本。

我們用指數分配把它具體化,也就是前一階段那個無記憶的等待時間。它的 cdf 是 F(x) = 1 - e^(-lambda*x)(x >= 0)。要求反函數,令 u = 1 - e^(-lambda*x) 並解出 x:e^(-lambda*x) = 1 - u,所以 x = -ln(1 - u) / lambda。這就是分位數函數。於是配方是:從 Uniform(0, 1) 抽出 U,算 X = -ln(1 - U) / lambda,X 就是一個如假包換的 Exponential(lambda) 樣本。取 lambda = 0.5、抽到 U = 0.75,你得到 X = -ln(0.25) / 0.5 = (1.386) / 0.5 = 2.77——一個誠實的指數等待時間,由單一個均勻亂數變出來。

PIT  (forward) :  X ~ F      =>   U = F(X)      ~ Uniform(0, 1)
Inverse (back) :  U ~ Unif    =>   X = F^(-1)(U) ~ F

Exponential(lambda):
   F(x)     = 1 - e^(-lambda x)          (the cdf)
   F^(-1)(u)= -ln(1 - u) / lambda        (the quantile function)

   draw  U = 0.75,  lambda = 0.5
   X = -ln(1 - 0.75)/0.5 = -ln(0.25)/0.5 = 2.77
正向給出平坦;反向給出你指定的任何形狀。指數分配從頭到尾算過一遍。

回報:從任何東西模擬抽樣

這趟回程是 蒙地卡羅模擬的主力。電腦無法天生產生一個指數或鐘形的數,但它非常擅長一件事:吐出 [0, 1] 上近似均勻的數。反變換法,也叫 反變換抽樣,把那一項便宜的本事變成從任何你寫得出分位數函數的連續分配抽樣的能力。整條流水線只有三步。

  1. 產生一個均勻數:從 Uniform(0, 1) 抽出 U,那是電腦直接給你的唯一一種亂數。
  2. 寫下目標 cdf F,並求其反函數得到分位數函數 F^(-1)(從 u = F(x) 解出 x)。
  3. 把它映射過去:X = F^(-1)(U)。得到的 X 恰好服從你想要的分配;要多少個獨立抽樣就重複多少次。

誠實的代價是:第二步需要一個可用的 F^(-1),而許多著名分配並沒有一個漂亮的反函數。常態就是經典的犯規者:它的 cdf 沒有封閉形式的反函數,所以單純的反變換就卡住了——這正是下一個工具 Box-Muller 變換存在的原因,它改用一個巧妙的變數變換,從兩個均勻數變出兩個獨立的常態。當分位數函數很彆扭但能用數值方法取得時,軟體在幕後仍會用反變換;當它根本無望時,抽樣器就退回到拒絕法,或前幾篇那些變數變換的把戲。反變換是第一個該伸手去拿的,但不是唯一的。

另一個回報:一把通用的量尺

模擬搶了頭條,但正向的方向悄悄地支撐著許多統計。因為對任何連續模型 F(X) 永遠是 Uniform(0, 1),這個變換給了你一把單一的、與分配無關的參照尺,任何模型都能拿它來檢驗。如果你對資料配適了一個分配而且配得對,那麼把你的觀測值代進配適出的 F,應該會得到看起來在 [0, 1] 上均勻散布的數。若它們反而擠向 1、或在中間下陷,那這個模型就漏了某些東西——你假設的 F 形狀錯了。這就是機率圖與配適度診斷背後的引擎:把一切變成均勻數,再評斷它的均勻程度。