Chapter 1 貝葉斯推斷的思想

你是一名經(jīng)驗(yàn)豐富的程序員,但是bug仍然暗藏在你的代碼中。實(shí)現(xiàn)一個(gè)極其困難的算法后,你決定在一個(gè)簡單的例子上測試自己的代碼。過了。然后在一個(gè)稍稍困難的問題上進(jìn)行測試,還是過了。接著這樣下去,更加復(fù)雜的問題,都過了!你開始相信自己的代碼莫有問題了~

如果你這樣子進(jìn)行思考,那么祝賀你,你是在如貝葉斯主義者那樣進(jìn)行思考!貝葉斯推斷只是簡單地在考慮了新的證據(jù)后,更新你的信念。貝葉斯主義者很少對于一個(gè)結(jié)果很肯定,但是他們可以對某件事有一定的信心。就像上面的這個(gè)例子,我們不會100%地肯定我們的代碼是無bug的除非我們在每個(gè)可能的情形下進(jìn)行測試;這個(gè)在現(xiàn)實(shí)情形下是不可能的。相反,我們可以在大量的問題上對這代碼進(jìn)行測試,如果測試結(jié)果都OK,那么我們可以認(rèn)為代碼本身沒有什么問題,對正確性相當(dāng)?shù)乜隙ǎ詴兴鶓岩伞X惾~斯推斷的思想是完全一致的:我們更新自己對結(jié)果的信念;幾乎不會絕對滴相信一件事的發(fā)生,除非我們已經(jīng)排除了所有的可能性。

思維的貝葉斯?fàn)顟B(tài)

貝葉斯推斷和傳統(tǒng)的統(tǒng)計(jì)推斷的不同在于它保留了不確定性。初看,這是一種不太好的統(tǒng)計(jì)技術(shù)。難道統(tǒng)計(jì)不是關(guān)于從隨機(jī)性中推導(dǎo)出確定性的么?為了弄清楚這一點(diǎn),我們需要開始像一位貝葉斯學(xué)家一樣地考慮問題。

貝葉斯世界觀下,概率被當(dāng)作事件的可信度的度量,即我們對一個(gè)事件發(fā)生有多么的確定。事實(shí)上,我們一會兒會看到這就是概率的自然的解釋。

為了更加清晰地說明這點(diǎn),我們考慮另一個(gè)概率的解釋:頻率主義者,這是更加經(jīng)典的統(tǒng)計(jì)觀點(diǎn)的持有者,他們假設(shè)概率是一個(gè)事件的長期運(yùn)行所獲得的頻率。例如,在頻率主義的觀點(diǎn)下,飛機(jī)失事的概率就是長期過程中飛機(jī)失事的頻率。這種觀點(diǎn)對于很多的情形的事件的概率是很合理的。然而你想想:我們經(jīng)常對總統(tǒng)選舉的結(jié)果賦值概率,但是這樣的事件就只會進(jìn)行一次!頻率主義者通過啟用另外的現(xiàn)實(shí)繞過這個(gè)問題,然后對所有這些現(xiàn)實(shí)進(jìn)行匯總,然后出現(xiàn)的頻率定義了這個(gè)概率。

而貝葉斯學(xué)派,有一種更加符合直覺的觀點(diǎn)。他們將概率解釋成信念(belief)的度量,或者一個(gè)事件發(fā)生的信心(confidence)。簡單說,概率就是一個(gè)觀點(diǎn)的總結(jié)。一個(gè)將信念為0賦給了事件,則表示不相信這個(gè)事件會發(fā)生;相反,如果對該事件賦值為1那么這個(gè)人是絕對相信事件會發(fā)生。而介于0和1之間的那些值則對應(yīng)于其他的結(jié)果。這樣定義方式,在飛機(jī)事件的例子中的概率是相符的,已經(jīng)觀察到了飛機(jī)事件的頻率后,個(gè)人的信念應(yīng)當(dāng)與那個(gè)頻率相同,而不包含其他外部的信息。類似的,在這個(gè)定義下,概率和信念相同,這樣子在總統(tǒng)選舉的例子中,我們對于選舉結(jié)果的概率(信念)的描述就是很合理的:你對候選人A獲得勝利有多確信?

注意在上面的例子中,我們把信念(概率)度量賦給了一個(gè)個(gè)體,而不是給大自然。這是非常有趣的,因?yàn)檫@個(gè)定義帶來了個(gè)體之間沖突的信念的可能。不過這樣也是更加合理的:不同的個(gè)體對事件的發(fā)生有不同的信念,因?yàn)樗麄儞碛袑@個(gè)世界的不一樣的信息。這種不同信念的存在并不是說某些人就是錯(cuò)誤的。考慮下面的場景,描述了個(gè)人信念和概率之間的關(guān)系:

  • 我丟一個(gè)硬幣,我們同時(shí)來猜測結(jié)果。假設(shè)硬幣是公平的,我們可能都同意出現(xiàn)正面的概率是1/2。接著,假設(shè)我偷偷看了一眼。現(xiàn)在我已經(jīng)知道硬幣的正反了:我置概率1.0給正面或者反(這里隨便給)。現(xiàn)在問你對硬幣正反的猜測的信念?我對結(jié)果的知識并不影響硬幣的結(jié)果。因此,我們對結(jié)果賦給了不同的概率。
  • 你的代碼有一個(gè)bug或者沒有,但是我們都不能確信哪個(gè)是正確的,盡管我們都持有這樣的信念——有或者沒有bug。
  • 一個(gè)病人出現(xiàn)了3個(gè)癥狀——xyz。有若干種疾病可能會導(dǎo)致所有這些癥狀,但是僅有一個(gè)疾病出現(xiàn)。一名醫(yī)生對某個(gè)疾病持有信念,但是不同的醫(yī)生卻會有略微不同的信念。

將概率看作信念的哲學(xué)觀點(diǎn)對人類來說是自然的。我們將會不斷地使用這個(gè)觀點(diǎn),因?yàn)槲覀兒褪澜缃换サ倪^程中只能看到部分的真相(partial truth),但是可以搜集更多的證據(jù)來形成信念。而對立著的是,我們需要被訓(xùn)練成頻率主義者。

為了熟悉傳統(tǒng)的概率形式,我們將對事件A的信念表示為P(A)。我們將這個(gè)數(shù)量稱為先驗(yàn)概率

John Maynard Keynes——一位著名的經(jīng)濟(jì)學(xué)家和思想家,曾說:“當(dāng)事實(shí)發(fā)生變化,我改變自己的思維。你呢,先生?”這段話反映了一名貝葉斯主義者在看到證據(jù)后的信念的更新。甚至,尤其是,如果證據(jù)和剛開始時(shí)候的信念完全相違的時(shí)候,這個(gè)證據(jù)是不可以被忽略的。我們將更新后的信念表示為P(A|X),解釋為在給定證據(jù)X后的A事件發(fā)生的概率。我們稱更新后的這個(gè)信念為后驗(yàn)概率以示區(qū)別。例如,考慮上面那些例子在觀察到一些證據(jù)X后的后驗(yàn)概率:

  • P(A): 硬幣有50%的可能性出現(xiàn)正面。P(A|X): 你看了硬幣,觀察到正面出現(xiàn),表示該信息為X,然后直接把正面的概率賦為1.0而反面的概率為 0.0
  • P(A): 這大段復(fù)雜的代碼可能有一個(gè)bug。P(A|X): 代碼過了所有X的測試;當(dāng)然仍會有可能出現(xiàn)bug,不過這個(gè)出現(xiàn)的概率已經(jīng)相當(dāng)小了
  • P(A): 病人有任意數(shù)量的疾病。P(A|X): 執(zhí)行了血液測試產(chǎn)生了證據(jù)X,排除了部分病因。

在每個(gè)例子中,我們都沒有十足的把握在看到新的證據(jù)X能夠完全放棄先驗(yàn)的信念,但是我們對先驗(yàn)信念進(jìn)行的重新的權(quán)衡從而整合進(jìn)新出現(xiàn)的那些證據(jù)。(我們給一些信念新的權(quán)值或者信任度)。

通過引入事件的先驗(yàn)可能性,我們已經(jīng)認(rèn)可了做出的任何猜測都是潛在地錯(cuò)誤的。在觀測了數(shù)據(jù)、證據(jù)或者其他信息,我們更新自己的信念,然后我們的猜測會變得略微正確一些。這是預(yù)測硬幣的另一面,一般來說我們都朝著更加啊正確的方向前行。

實(shí)踐中的貝葉斯推斷

如果頻率主義者和貝葉斯推斷都是程序函數(shù),其輸入是統(tǒng)計(jì)問題,那么這兩者在返回給用戶的方式上是很不同的。頻率主義的推斷函數(shù)可能是返回一個(gè)數(shù)字,表示一個(gè)估計(jì)(典型的就是諸如樣本均值這樣的匯總數(shù)據(jù)),而貝葉斯函數(shù)會返回概率

例如,在上面我們的調(diào)試問題中,調(diào)用頻率主義函數(shù)的方法就是:“我的代碼過了所有X個(gè)測試;它是不是不含有bug?”會返回一個(gè)YES。另一方面,對貝葉斯函數(shù)的問題:“我的代碼通常會有bug。我的代碼過了所有X個(gè)測試;我的代碼是不是不含有bug?”將會返回非常不同的東西:YES和NO的不同。這個(gè)函數(shù)會返回:

YES的概率是0.8;NO的概率是0.2

這就和頻率主義的觀點(diǎn)得到的結(jié)果非常不同。請注意貝葉斯函數(shù)接受了“我的代碼通常會有bug”這個(gè)額外的參數(shù)。這是先驗(yàn)的知識。通過包含先驗(yàn)的參數(shù),我們告訴貝葉斯函數(shù)來加入我們關(guān)于處境的信念。技術(shù)上看,貝葉斯函數(shù)中的參數(shù)是可選的,但是我們將看到去除這點(diǎn),會帶來自身的后果。

引入證據(jù)

在我們獲得了越來越多的證據(jù)后,我們的先驗(yàn)信念將被新的證據(jù)沖刷。例如,若你先驗(yàn)的信念是某些荒唐的事情(我認(rèn)為今天太陽會爆炸)然后每天都在證明你是錯(cuò)誤的,你可能會希望任何的推斷會糾正你的觀點(diǎn),或者至少在某種程度上改變你的信念。貝葉斯推斷會糾正這個(gè)信念。

用N來表示我們已有證據(jù)的例子的數(shù)目。當(dāng)我們搜集了一個(gè)無窮多的證據(jù)時(shí),不妨設(shè)N -> infinity,我們的貝葉斯結(jié)果通常和頻率主義者相似。因此,對很大的N,統(tǒng)計(jì)推斷多少是客觀的。另一方面,當(dāng)N比較小的時(shí)候,推斷更加不穩(wěn)定:頻率主義的估計(jì)有更大的方差和置信區(qū)間。這個(gè)在貝葉斯分析超越。通過引入先驗(yàn)概率,和返回的概率,我們保留了非確定性,這就說明了小的數(shù)據(jù)集所具備的推斷能力。

有人會覺得,對于大的N,我們可以忽略這兩種技術(shù)之間的區(qū)別,并且會倒向計(jì)算代價(jià)小的頻率主義方法。持這樣觀點(diǎn)的人們在做出上面的決定之前建議看下面Andrew Gelman所講的這段話:

樣本大小從來不會很大。如果N太小以至于難以獲得一個(gè)充分精確的估計(jì),你需要獲得更多的數(shù)據(jù)(或者做出更多的假設(shè))。但是,一旦N足夠的大了,你可以開始把數(shù)據(jù)進(jìn)行分解來學(xué)習(xí)更多的經(jīng)驗(yàn)(例如,在一個(gè)公共觀點(diǎn)池中,一旦你有了對于整個(gè)國家的好的估計(jì),你可以估計(jì)男人和女人,北方和南方,不同的年齡群組等等)。N是從來都不足夠的,因?yàn)椋绻绻亲銐蛄撕螅銓⑿枰_一個(gè)新的需要更多數(shù)據(jù)的任務(wù)。

頻率主義方法就錯(cuò)了么?

不是

頻率主義方法仍然在很多的領(lǐng)域是相對有效的。諸如最小方差線性回歸,LASSO回歸,和期望最大算法還是快速且強(qiáng)大的。貝葉斯方法填補(bǔ)了這些方法留下的空白領(lǐng)域,可以得到更多的靈活的模型。

大數(shù)據(jù)

讓人費(fèi)解的是,大數(shù)據(jù)的預(yù)測分析問題往往是使用相對簡單的算法解決的。因此我們可以這樣說,大數(shù)據(jù)預(yù)測的難點(diǎn)不是算法本身,而是數(shù)據(jù)的存儲和計(jì)算執(zhí)行的難度。(讀者影帶考慮一個(gè)Gelman的話并且問“我是真的擁有大數(shù)據(jù)么?”)

更加困難的分析問題包含了中等量的數(shù)據(jù),而最為困難的是相當(dāng)小的數(shù)據(jù)。使用一個(gè)類似于Gelman上述的觀點(diǎn),如果大數(shù)據(jù)足夠大可以立即解決的問題,那么我們對于那些不是過大的數(shù)據(jù)集更有興趣。

我們的貝葉斯框架

我們對信念感興趣,這個(gè)可以解釋為按照貝葉斯觀點(diǎn)下的概率。我們對于一個(gè)事件A有一個(gè)先驗(yàn)概率,信念由先前的信息形成,例如我們在執(zhí)行測試之前相信了bug可能會出現(xiàn)。

另外,我們觀測我們的證據(jù)。繼續(xù)我們的bug代碼例子:如果我們的代碼過了X個(gè)測試,我們希望更新增加了這個(gè)認(rèn)識之后的信念。我們稱這個(gè)新的信念為后驗(yàn)概率。通過下面的公式來更新我們的信念,也就是傳說中的貝葉斯定理(以發(fā)現(xiàn)者Thomas Bayes命名):

P(A|X) = P(X|A)P(A) / P(X) \propto P(X|A)P(A)

上面的公式并不是專屬于貝葉斯推斷的:這是一個(gè)數(shù)學(xué)事實(shí),在貝葉斯推薦之外也經(jīng)常這樣使用。在這里,BI僅僅通過它來聯(lián)結(jié)先驗(yàn)概率P(A)和后驗(yàn)概率P(A|X)

例子:強(qiáng)制拋硬幣例子

每本統(tǒng)計(jì)課本肯定會包含拋硬幣的例子。我也會使用它。假設(shè),你不確定拋擲一枚硬幣出現(xiàn)正面的概率(拆臺者說:這不是50%么!!!)。你相信在比例之后暗藏著某種真理,就叫p吧,但是并沒有任何關(guān)于p究竟是多少的先驗(yàn)的認(rèn)識。
我們開始拋硬幣,記錄下來觀察值:正面或者反面。這就是我們的觀察數(shù)據(jù)。一個(gè)有趣的問題就是我們的推斷在觀測發(fā)生變化后如何改變?具體講,就是我們的后驗(yàn)概率變成什么樣子,在我們數(shù)據(jù)很少和很多的時(shí)候分別是什么樣子。
下面我們畫出來在我們觀測出更多的數(shù)據(jù)(拋擲硬幣的結(jié)果)更新后驗(yàn)概率的序列。

from IPython.core.pylabtools import figsize
import numpy as np
from matplotlib import pyplot as plt
figsize(11, 9)

import scipy.stats as stats

dist = stats.beta
n_trials = [0, 1, 2, 3, 4, 5, 8, 15, 50, 500]
data = stats.bernoulli.rvs(0.5, size=n_trials[-1])
x = np.linspace(0, 1, 100)

# For the already prepared, I'm using Binomial's conj. prior.
for k, N in enumerate(n_trials):
    sx = plt.subplot(len(n_trials) / 2, 2, k + 1)
    plt.xlabel("$p$, probability of heads") \
        if k in [0, len(n_trials) - 1] else None
    plt.setp(sx.get_yticklabels(), visible=False)
    heads = data[:N].sum()
    y = dist.pdf(x, 1 + heads, 1 + N - heads)
    plt.plot(x, y, label="observe %d tosses,\n %d heads" % (N, heads))
    plt.fill_between(x, 0, y, color="#348ABD", alpha=0.4)
    plt.vlines(0.5, 0, 4, color="k", linestyles="--", lw=1)

    leg = plt.legend()
    leg.get_frame().set_alpha(0.4)
    plt.autoscale(tight=True)


plt.suptitle("Bayesian updating of posterior probabilities",
             y=1.02,
             fontsize=14)

plt.tight_layout()
貝葉斯后驗(yàn)概率的變化

后驗(yàn)概率由曲線表示,我們的非確定性跟曲線的寬度相關(guān)的。如上圖所示,當(dāng)我們開始觀察數(shù)據(jù)時(shí),我們的后驗(yàn)概率開始偏移。最終,當(dāng)我們看到越來越多的數(shù)據(jù)時(shí),概率緊緊滴集中在p = 0.5的位置附近。

注意看到途中的峰點(diǎn)不是落在0.5。但是繼續(xù)增加數(shù)據(jù)后,肯定會落在那個(gè)地方。下一個(gè)例子會展示貝葉斯推斷的數(shù)學(xué)。

例子:bug還是僅僅甜點(diǎn),不能預(yù)估的未來?

令A(yù)表示我們代碼沒有bug的事件。讓X表示代碼過了所有測試用例。現(xiàn)在,我們將沒有bug的先驗(yàn)概率當(dāng)作一個(gè)變量,即P(A) = p

我們對P(A|X)感興趣,就是給定了測試用例X后的沒有bug的概率。為使用上面的公式,我們需要計(jì)算一些值。

什么是P(X|A)即已知沒有bug的情況下過了X個(gè)測試的概率?當(dāng)我傻啊,就是1啊,沒有bug的代碼肯定會過了所有的測試用例。

P(X)則有一點(diǎn)兒的tricker:事件X可以被分成兩種情況:事件X出現(xiàn),我們的代碼是有bug的(~A),或者X出現(xiàn),代碼是沒有bug的(A)。公式如下:

P(X) = P(X and A) + P(X and ~A) 
     = P(X|A)P(A) + P(X|~A)P(~A) = P(X|A) p + P(X|~A) (1-p)

我們上面已經(jīng)計(jì)算了P(X|A)。另外,P(X|~A)是主觀的;我們的代碼很可能在有bug的情況下沒有被測試測出來。注意這個(gè)值是和已完成的測試的數(shù)量及測試的復(fù)雜程度等等因素是相關(guān)的。讓我們保守一些,給出P(X|~A) = 0.5。那么

P(A|X) = 1*p / (1 * p + 0.5 * (1 - p))
       = 2p / 1 + p 

這就是后驗(yàn)概率。這是我們的先驗(yàn)概率p的函數(shù)的參數(shù),p \in [0, 1]

figsize(12.5, 4)
p = np.linspace(0, 1, 50)
plt.plot(p, 2 * p / (1 + p), color="#348ABD", lw=3)
# plt.fill_between(p, 2*p/(1+p), alpha=.5, facecolor=["#A60628"])
plt.scatter(0.2, 2 * (0.2) / 1.2, s=140, c="#348ABD")
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.xlabel("Prior, $P(A) = p$")
plt.ylabel("Posterior, $P(A|X)$, with $P(A) = p$")
plt.title("Are there bugs in my code?")
figure_2.png

如果我們觀測了X測試用例過了當(dāng)先驗(yàn)概率p很低的時(shí)候,我們可以看到最大的增益。如果我自認(rèn)為是一個(gè)牛逼程序員,所有我給自己一個(gè)先驗(yàn)的概率為0.20,有20%的概率我的代碼是沒有bug的。更加實(shí)際地,先驗(yàn)概率應(yīng)該和代碼的復(fù)雜程度和規(guī)模相關(guān),但是就讓我這么設(shè)置吧。那么我更新后的無bug的信念是0.33
回憶先驗(yàn)時(shí)概率:p是沒有任何bug的先驗(yàn)概率,所以1-p是有bug的先驗(yàn)概率。

類似的,我們的后驗(yàn)同樣是概率,給定所有測試都通過的情形下沒有bug的概率是P(A|X),因此1 - P(A|X)是給定所有測試用例都通過的情形下出現(xiàn)bug的概率。那么我們的后驗(yàn)概率是什么樣的?下面是先驗(yàn)和后驗(yàn)概率的圖。

figsize(12.5, 4)
colours = ["#348ABD", "#A60628"]

prior = [0.20, 0.80]
posterior = [1. / 3, 2. / 3]
plt.bar([0, .7], prior, alpha=0.70, width=0.25,
        color=colours[0], label="prior distribution",
        lw="3", edgecolor=colours[0])

plt.bar([0 + 0.25, .7 + 0.25], posterior, alpha=0.7,
        width=0.25, color=colours[1],
        label="posterior distribution",
        lw="3", edgecolor=colours[1])

plt.xticks([0.20, .95], ["Bugs Absent", "Bugs Present"])
plt.title("Prior and Posterior probability of bugs present")
plt.ylabel("Probability")
plt.legend(loc="upper left");
figure_3.png

注意到,在我們觀測到X發(fā)生后,不會出現(xiàn)bug的概率有所增加。通過增加測試的數(shù)量,我們確信不會有bug出現(xiàn)。

這是貝葉斯推斷和貝葉斯規(guī)則的簡單例子。不幸的是,進(jìn)行更加復(fù)雜的貝葉斯推斷,我們需要更多的數(shù)學(xué)知識。后面我們會看到這樣的數(shù)學(xué)分析事實(shí)上是不必須的。首先我們需要擴(kuò)展建模工具,下面介紹概率分布。如果你已經(jīng)相當(dāng)?shù)氖煜ぃ蔷蜑t灑地跳過吧。


概率分布

讓我們快速回憶一下什么是概率分布:令Z為某個(gè)隨機(jī)變量。與Z相關(guān)的概率分布函數(shù)Z的不同的值賦予了概率。圖形上看起來,概率分布是一個(gè)曲線,其某個(gè)結(jié)果的概率曲線的高度成比例。你可以在本節(jié)的第一張圖片中看到。
我們可以講隨機(jī)變量分成三類:

  • 離散:離散隨機(jī)變量可能僅僅假設(shè)值存在于一個(gè)指定的列表中。就像人口,電影評分和投票數(shù)目這些都是離散的隨機(jī)變量。
  • 連續(xù):連續(xù)隨機(jī)變量可以取任何一個(gè)準(zhǔn)確的值。例如,溫度、速度、事件、顏色等等都可以被建模成連續(xù)的值因?yàn)槟憧偪梢宰屩翟絹碓骄_。
  • 混合:混合的隨機(jī)變量給離散和連續(xù)的隨機(jī)變量賦予概率,他是上面兩種的組合。

離散情形

如果Z是離散的,那么他的分布被稱為概率質(zhì)量函數(shù),這個(gè)東西度量了Z取值為k的概率,用P(Z=k)表示。注意這個(gè)概率質(zhì)量函數(shù)完全地刻畫了隨機(jī)變量Z,如果我們知道了概率質(zhì)量函數(shù),我們就能了解Z的所有行為。有很多流行的概率質(zhì)量函數(shù):我們將根據(jù)需要引出這些質(zhì)量函數(shù),但現(xiàn)在我們隆重介紹第一個(gè)相當(dāng)重要的概率質(zhì)量函數(shù)。我們稱Z是泊松分布,當(dāng):

P(Z=k) = \lambda^k e^{-\lambda} / k!, k = 0, 1, 2, ...

\lambda是這個(gè)分布的參數(shù),它控制了分布圖形的形狀。對泊松分布,\lambda可以是任何正數(shù)。通過增加\lambda,我們增加了更多的概率給更大的值,而相反,通過降低\lambda我們增加了更大的概率給了較小的值。也常稱\lambda為泊松分布的強(qiáng)度(intensity)

引入我們的第一個(gè)工具:PyMC

PyMC是一個(gè)用于貝葉斯分析的python庫。他是一個(gè)快速的處于較好維護(hù)狀態(tài)下的庫。但是不太爽的是它本身缺乏某些領(lǐng)域的文檔介紹,尤其是銜接初學(xué)者和黑客的橋梁的那部分。這本書本身的目標(biāo)就是來解決這個(gè)問題,同樣也展示了為何Py MC這樣棒!
我們將會使用PyMC對這個(gè)問題進(jìn)行模型。這種類型的程序設(shè)計(jì)被稱為概率程序設(shè)計(jì)(probabilistic programming),這是一個(gè)令人困惑的術(shù)語,因?yàn)橐肓穗S機(jī)產(chǎn)生的代碼,可能已經(jīng)嚇住了不少用戶了。代碼本身不是隨機(jī)的;其概率意味只是在我們在創(chuàng)建概率模型的時(shí)候使用的程序變量作為了模型的一部分。模型組成部分在PyMC框架內(nèi)是一等的原語(primitives)。
B.Cronin有一段關(guān)于概率程序設(shè)計(jì)的有感染力的描述:

用另外的一種方式看:不同于傳統(tǒng)的程序,他們只是運(yùn)行在一個(gè)向前的方向上,概率程序在正向和反向上都有運(yùn)行。向前運(yùn)行就是計(jì)算了那些它包含的對這個(gè)世界的假設(shè)產(chǎn)生的后果,但是同樣也可以通過數(shù)據(jù)來限制可能的解釋而后向運(yùn)行。在實(shí)踐中,很多概率程序設(shè)計(jì)系統(tǒng)會聰明地交織這些前向和后向操作來高效地達(dá)到最佳的解釋。
由于術(shù)語概率程序設(shè)計(jì)帶來的困惑,我就將其說成編程(programming),因?yàn)樗緛砣缡恰?/p>

PyMC的代碼讀起來很簡單。最為新鮮的就是它的語法了,我會將代碼分解開來介紹每個(gè)部分的。只需要記住,我們表示模型的成分(\tau, \lambda_1, \lambda_2)為變量:

import pymc as pm

alpha = 1.0 / count_data.mean()  # Recall count_data is the
                               # variable that holds our txt counts
lambda_1 = pm.Exponential("lambda_1", alpha)
lambda_2 = pm.Exponential("lambda_2", alpha)

tau = pm.DiscreteUniform("tau", lower=0, upper=n_count_data)

原地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內(nèi)容