用貝葉斯思想,來談談為什麼趙處長演的這麼像,檢察機關還是揪著他不放。
提到貝葉斯推斷,就不得不提Bayesian Methods for Hackers 這本書,簡單易懂,印刷精美。猶記得當年第一次見到ipython notebook 就是因為這本書就是用notebook寫的,現在也有了中文版。中文版翻譯的水平很高,當我拿著這本書的中文版準備跟大家分享時,看到第一章標題 「貝葉斯推斷的哲學」 這句話時,我邪惡了一下。腦子裡迅速閃過更衣室大戰的哲♂學六邊形
我本來是想用 哲♂學 來講解貝葉斯思想的,但是由於現在的時代主題是反♂腐,所以我還是以反腐為例子,以《人民的名義》,談談貝葉斯思想吧。
趙處長是人民公僕的概率
談反腐之前,先介紹一下貝葉斯學派的哲學和經典學派有什麼區別。書中給了一個這樣的解釋:經典統計學家眼中的概率,實際上是一連串長期發生的事件的頻率,比如坐飛機失事的概率是多大?經典統計學家的套路是,找出近幾年全球航班的飛行次數,作為分母。再找出對應時間範圍內航班的失事次數,作為分子。於是失事的概率就是:
航班失事 = 失事次數 / 總班次好了,問題來了,如果用經典統計學,怎麼回答趙處長是不是人民公僕的問題呢?我們照葫蘆畫瓢:
趙處長是人民公僕=人民公僕次數 / 總次數說不通了吧,趙處長只有一個,他腐不腐敗真相更是只有一個,所以經典統計學的「一連串長期發生」在這裡不起作用了。儘管如此,但是其實我們是有很多線索的。在電視劇中,這個線索就是 劇情,在數據科學中,這個就是我們拿到的 數據。而貝葉斯的「哲學」,正是通過合理的利用數據(劇情),去做參數估計(趙處長是不是人民公僕)。
基於這一「哲學」,我們再來審視下貝葉斯公式:
把情形代入公式:
P(劇情發展下,趙處長是人民公僕的概率)=P(θ|D)(後驗分布)P(趙處長是人民公僕的概率)=P(θ)(先驗分布)P(在趙處長是人民公僕的可能性為θ的情況下,出現這一劇情的概率)=P(D|θ)P(趙處長身份是人民公僕or腐敗分子的可能性相加)=∫P(θ′)...簡單解釋一下:
- 先驗分布 P(θ)。注意這裡 θ 取值,我們認為趙處長要不就是清白的人民公僕,要不就是腐敗分子,即這裡的 θ 是個0/1二值化的取值,千萬別給他扣上 80% 的人民公僕這個帽子,趙處長會來找你要清白的。我們討論的是 P(θ) 這個概率,θ 在這裡不是一個概率分布,所以我們這裡討論的也是最的貝葉斯估計,只是我們為了政治正確,以及簡化問題,不去討論諸如他應該是「80%人民公僕」這種問題。這個先驗概率是,我們在觀劇過程中,對趙處長是不是腐敗分子的直覺———注意這裡只是直覺而已,是在沒有任何證據的情況下,我們隨便蒙一下。
但是一個負責審核全國土地審批的處長,是不是腐敗分子,我們不能去蒙啊,我們亂蒙,趙處長會請律師起訴我們侵犯他的名譽權的。
- 先驗分布支不支持數據 P(D|θ)。我們需要看看,我們蒙的這種可能性 θθ,是否支持我們手裡的證據 (D),即 P(D|θ) 高不高、接不接近1。
於是我們要和劇情結合一下(並且只依賴劇情)。注意這裡的劇情是可以分開看的,比如三張搜查令,我們就看三段劇情。為什麼要分開呢?大家追劇只看結局不看過程嘛?當然不了,只有關注過程,才能有高潮迭起的快感,結尾只是一個儀式。貝葉斯相比經典統計學的特有的哲學,使得它也具備了這種「高潮迭起」的能力,即隨著劇情的發展,貝葉斯模型給出的趙處長是不是人民公僕的概率,會首先被老戲骨深入人心的表演給感染,然後不留情面的拆穿腐敗分子的本來面目。
P(趙處長是人民公僕的後驗概率1)=P(第一張搜查令的劇情|趙處長是人民公僕的先驗概率)
P(趙處長是人民公僕的後驗概率2)=P(前兩張搜查令的劇情|趙處長是人民公僕的先驗概率)
P(趙處長是人民公僕的後驗概率3)=P(全部劇情|趙處長是人民公僕的先驗概率)
場景1:第一張搜查令
在跟著劇情,感受貝葉斯推斷的哲學之前,我們得蒙一個先驗概率。先驗概率重要嗎?其實比較重要,但不起決定性作用,所以可以蒙一個,只要不離譜。蒙多少呢?這一開始一幫檢察官就去「社區送溫暖」,應該不會冤枉他吧,八成有問題,那就蒙 20% 可能性是人民公僕吧。
但是繼續看下去,似乎不對,哎,這個趙處長,是腐敗分子的話,怎麼吃這麼差,住這麼破,而且住處最後搜半天啥都沒有?人民公僕候處長活的也比他強啊!
來,我們把剛才的想法,用貝葉斯公式寫一下。假如說,我去中紀委,翻了近幾年腐敗分子的所有卷宗,總結出腐敗分子平時吃的如何、住的怎樣,家裡有沒有問題,應該可以得出這樣的一種分布 P(D|θ),θ=人民公僕or腐敗分子:
什麼?人民公僕也山珍海味?家裡也一堆問題?忽略這個,只是舉個例子而已,美術不好畫不好那種曲線,哈哈,大家別舉報我。假如啊,從我在中紀委的資料統計結果來看,可能只有 1% 的腐敗分子吃的小於等於趙處長,而有 20% 的人民公僕吃的小於等於趙處長,再基於我們之前社區送溫暖應該有問題、P(θ)=0.2 的先驗概率,求第一張搜查令的劇情的概率:
p_prior = 0.2p_eat = [0.2, 0.01]p_live = [0.2, 0.01]p_trouble = [0.2, 0.01]p_posterior1 = p_posterior1 == (p_prior*p_eat[0]*p_live[0]*p_trouble[0]) / (p_prior*p_eat[0]*p_live[0]*p_trouble[0]+ ((1-p_prior)*p_eat[1]*p_live[1]*p_trouble[1])
證據面前,我們發現,與先驗概率不同的是,這很可能是個人民公僕啊!
場景2:第二張搜查令
沒搜出啥,看起來候處長走了,到樓底下,亮出第二張搜查令,去搜趙處長辦公室。搜出了些私房錢,半瓶五糧液,確實有點寒摻,都不如人民公僕。趙處長覺得火候到了,跟檢察機關拍桌子瞪眼,結果檢察機關果斷亮出證據,你肯定有問題,我們沒辦過錯案,然後趙處長忙中出錯的交代了被人行賄的事實。
好了,我又去中紀委翻資料了,給出了這幾個事件的概率:
p_prior = 0.2p_eat = [0.2, 0.01]p_live = [0.2, 0.01]p_trouble = [0.2, 0.01]p_money = [0.2, 0.01]p_drink = [0.2, 0.01]p_biaoyan = [0.99, 0.01]p_target = [0.00001, 0.99999]p_pyjiaoyi= [0.0001, 0.9999]l_prob = [ p_eat, p_live, p_trouble, p_money, p_drink, p_biaoyan, p_target, p_pyjiaoyi]l_v = functools.reduce(lambda x,y: [x[0]*y[0], x[1]*y[1]], l_prob)p_posterior2 = p_prior * l_v[0] / (p_prior * l_v[0] + (1-p_prior) * l_v[1])
OK,結果顯示,這人已經不像是個人民公僕了。原因很簡單,我們相信被候處長盯上的人這麼多年來都是腐敗分子,除非是中了彩票(經過統計發現這種人通常 99.9% 有問題)。但是這也只是感覺而已,正如趙處長所言:
場景3:第三張搜查令
這個不用我仔細寫了,我不用 0/1 表示,並非漠視法律,而只是為了防止無法計算而已。
p_prior = 0.2p_eat = [0.2, 0.01]p_live = [0.2, 0.01]p_trouble = [0.2, 0.01]p_money = [0.2, 0.01]p_drink = [0.2, 0.01]p_biaoyan = [0.99, 0.01]p_target = [0.00001, 0.99999]p_pyjiaoyi= [0.0001, 0.9999]p_villa = [0.0000001, 0.99999999]p_moneyInFreezer = [0.0000001, 0.99999999]p_moneyInWall = [0.0000001, 0.99999999]p_moneyInBed = [0.0000001, 0.99999999]l_prob = [ p_eat, p_live, p_trouble, p_money, p_drink, p_biaoyan, p_target, p_pyjiaoyi, p_villa, p_moneyInFreezer, p_moneyInWall, p_moneyInBed]l_v = functools.reduce(lambda x,y: [x[0]*y[0], x[1]*y[1]], l_prob)p_posterior3 = p_prior * l_v[0] / (p_prior * l_v[0] + (1-p_prior) * l_v[1])
結果顯示,是人民公僕的概率還有那麼百分之幾,就當是給他這麼多年來辛苦表演的回報吧,確實,從這個角度上來說,他演的確實很像一個人民公僕。當然這個只是貝葉斯的哲♂學,不是法律的規定。我們這裡把趙處長前面各種表演成分加進去,只是為了娛樂,法律決不允許腐敗分子用演技逃脫罪責。
跟著貝葉斯的哲學,感受劇情的高潮迭起
綜上,我們選用了這些關鍵劇情,構成了趙處長在前兩集中,是如何先被懷疑,然後通過表演企圖逃脫法律懲處,最後在鐵一般的事實面前低頭認罪。這一系列過程中,隨著劇情發展,貝葉斯模型基於的數據也不斷變化,導致貝葉斯先驗分布經過數據估計得到的後驗分布,也是隨著劇情不斷發展而跌宕起伏的變化的。這一過程如下:
p_prior = 0.2p_eat = [0.2, 0.01]p_live = [0.2, 0.01]p_trouble = [0.2, 0.01]p_money = [0.2, 0.01]p_drink = [0.2, 0.01]p_biaoyan = [0.99, 0.01]p_target = [0.00001, 0.99999]p_pyjiaoyi= [0.0001, 0.9999]p_villa = [0.0000001, 0.99999999]p_moneyInFreezer = [0.0000001, 0.99999999]p_moneyInWall = [0.0000001, 0.99999999]p_moneyInBed = [0.0000001, 0.99999999]l_prob = [ p_eat, p_live, p_trouble, p_money, p_drink, p_biaoyan, p_target, p_pyjiaoyi, p_villa, p_moneyInFreezer, p_moneyInWall, p_moneyInBed]l_drama = [u"0.prior", u"1.eat", u"1.live", u"1.trouble", u"2.money", u"2.drink", u"2.biaoyan", u"2.target", u"2.pyjiaoyi", u"3.villa", u"3.money1", u"3.money2", u"3.money3"]l_posterior = [p_prior]for i in range(1,len(l_drama)): l_prob_sub = l_prob[0:i] l_v = functools.reduce(lambda x,y: [x[0]*y[0], x[1]*y[1]], l_prob_sub) p_posterior = p_prior * l_v[0] / (p_prior * l_v[0] + (1-p_prior) * l_v[1]) l_posterior.append(p_posterior)fig = plt.figure(figsize=(4,1))ax = fig.add_subplot(111)ax.plot(range(len(l_drama)), l_posterior )ax.set_xticks(range(len(l_drama)))ax.set_xticklabels(l_drama, rotation=45)ax.set_title("")
是的,根據貝葉斯的哲學,基於劇情分析的話,對趙處長進行的一系列搜查過程中,他的清白指數一直非常高,但是也並非完全沒有問題,畢竟以往也有腐敗分子這麼清白。趙處長為了徹底坐實自己的清白,發揮了他的表演天賦,拍桌子瞪眼要去請律師,企圖完全坐實自己是人民公僕的這個事實。他的目的也幾乎達到了,他的真誠與憤怒讓我們幾乎都要相信他是個人民公僕了,直到猴子一句「我幹了快二十年了,從沒有辦過一起冤假錯案」,給了腐敗分子當頭棒喝,其清白指數直線下降,趙處長在這一過程中自亂陣腳,交代了被人行賄的事實,最終在第三場搜查中,徹底現行。
寫在最後
這篇文章其實是我的深度學習系列文章的一個前傳。貝葉斯推斷對深度學習而言,至少是在調參的這一環節,是十分有用的,比如神經網路的框架定下來以後,具體每一層的參數怎麼設定會得到最好的結果?比如卷積核大小、數量等,這些都是深度學習過程中不會被模型自動優化的、需要手動指定的參數,即超參數。
那麼能不能再套一層,優化超參數呢?一篇非常經典的kaggle 冠軍作品分享Kaggle大賽:債務違約預測冠軍作品解析提到了四種超參數優化方式:網格搜索、隨機搜索、基於梯度的優化以及貝葉斯優化,並且貝葉斯優化得到了最佳的結果。因此,這篇文章的主要目的,就是介紹貝葉斯參數估計與統計推斷相關的基本知識。
推薦閱讀:
※目標檢測(1)-Selective Search
※Generating Chinese Poetry from Variational Auto-Encoder
※機器學習識別cfDNA
※梯度下降法求解logisitic回歸及其python代碼實現
※數學 · 神經網路(二)· BP(反向傳播)