PyMC3 中的 pm.Potential 是什麼?
我正在閱讀Probabilistic Programming & Bayesian Methods for Hackers第 5 章中 的 Price Is Right 示例。
上面寫著:
示例:針對價格合適的展示進行優化
如果您曾被選為價格合適的參賽者,請祝福您,因為在這裡我們將向您展示如何優化您在展示櫃上的最終價格。對於那些忘記規則的人:
- 兩名參賽者在 The Showcase 中競爭。
- 每位參賽者都會獲得一套獨特的獎品。
- 觀看後,參賽者被要求競標他們獨特的獎品套件的價格。
- 如果投標價格高於實際價格,投標的所有者將被取消中標資格。
- 如果投標價格低於真實價格低於250美元,獲勝者將獲得兩個獎項。
遊戲中的難點在於平衡您對價格的不確定性,保持您的出價足夠低以免出價過高,並試圖以接近價格的價格出價。
假設我們已經記錄了之前 The Price is Right 劇集的 Showcases,並且對真實價格遵循的分佈有先驗信念。為簡單起見,假設它遵循 Normal:
在後面的章節中,我們將實際使用真實的 Price is Right Showcase 數據來形成歷史先驗,但這需要一些高級 PyMC3 使用,所以我們不會在這裡使用它。目前,我們假設和.
我們需要一個模型來說明我們應該如何玩 Showcase。對於獎品套件中的每個獎品,我們都知道它的價格,但這種猜測可能與真實價格有很大不同。(再加上舞台上越來越大的壓力,你就會明白為什麼有些出價如此瘋狂)。假設您對獎品價格的看法也遵循正態分佈:
這就是貝葉斯分析很棒的真正原因:我們可以通過參數,並表達我們猜測的不確定性範圍。
為簡潔起見,我們假設每個套件有兩個獎品,但這可以擴展到任何數量。獎品套房的真實價格由下式給出, 在哪裡 是一些錯誤術語。
我們對更新感興趣鑑於我們已經觀察到這兩個獎項並且對它們有信念分佈。我們可以使用 PyMC3 執行此操作。
讓我們把一些價值觀具體化。假設觀察到的獎品套件中有兩個獎品:
- 美妙的加拿大多倫多之旅!
- 一個可愛的新吹雪機!
我們對這些物品的真實價格有一些猜測,但我們也不確定它們。我可以通過法線的參數來表達這種不確定性:
例如,我認為去多倫多旅行的真實價格是 12 000 美元,並且價格有 68.2% 的機會下降 1 個標準差,即我相信這次旅行有 68.2% 的機會位於 [9 000, 15 000] 中。
提供的代碼如下:
import pymc3 as pm data_mu = [3e3, 12e3] data_std = [5e2, 3e3] mu_prior = 35e3 std_prior = 75e2 with pm.Model() as model: true_price = pm.Normal("true_price", mu=mu_prior, sd=std_prior) prize_1 = pm.Normal("first_prize", mu=data_mu[0], sd=data_std[0]) prize_2 = pm.Normal("second_prize", mu=data_mu[1], sd=data_std[1]) price_estimate = prize_1 + prize_2 logp = pm.Normal.dist(mu=price_estimate, sd=(3e3)).logp(true_price) error = pm.Potential("error", logp) trace = pm.sample(50000, step=pm.Metropolis()) burned_trace = trace[10000:] price_trace = burned_trace["true_price"]
我不明白:
true_price
搭配如何price_estimate
?- 是從哪裡來
sd=(3e3)
的?- 什麼是
pm.Potential
對象?任何幫助將不勝感激。謝謝!
我們
pm.Potential
在這裡主要是為了繞過可能性的定義。我們通常以PyMC 文檔中描述的方式使用它來限制我們的可能性,但在這個例子中,我們永遠不會最終定義一個真正的可能性(這需要包含觀察結果)。因此,我們抽取的所有樣本都是基於我們如何定義potential
.我們的
price_estimate
和通過本質上使我們的觀察值true_price
彼此相關。當我們說:potential``true_price
logp = pm.Normal.dist(mu=price_estimate, sd=(3e3)).logp(true_price)
我們正在(我們的模擬觀察)提供的值上評估平均值為
price_estimate
、標準差為的正態分佈。這模擬了我們可以從中採樣以獲得後驗的可能性。至於作為標準偏差的有效性,我認為這是合理的,因為它是我們用來定義我們這裡的組件的標準偏差中的較大者:3e3``true_price``3e3``price_estimate
data_std = [5e2, 3e3]
我保留“error”作為變量的名稱,因為 Cam
pm.potential
在本章的 PyMC 版本中使用裝飾器時就是這樣命名函數的。如果不清楚,請告訴我!