谨慎选择我们的先验 - 对最优拟合概率分布搜索空间的一种约束
1. 哲學上先驗的概念
先驗,是康德哲學中的重要概念,它并不是單純在機器學習或者說AI中特定的專有名詞,實際上非常多學科中都包含有先驗(prior)和后驗(posterior)的概念。
在學習貝葉斯推斷統計的先驗概念之前,我們這章先來了解一些簡單的歷史。
0x1:人類知性的組成
我們的知性有兩方面的功能:
1. 一是邏輯功能:邏輯功能在知識的基礎上規定著思維的判斷形式,這是形式邏輯的范圍; 2. 一是認識功能:認識功能則為我們提供新的知識,這是“先驗邏輯”的領域;自亞里士多德以來,我們的形式邏輯已經相當完備了,沒有人懷疑形式邏輯是普遍必然的亦即“先天的”,因而為形式邏輯提供知識內容的先驗邏輯也一定是先天的,因為它是形式邏輯的基礎。
所以,形式邏輯與先驗邏輯是對應的,在每一個判斷形式的背后都有某種先驗的要素作為它的基礎,這種先驗要素就是“范疇”。
0x2:康德”哥白尼式的革命“
康德之前,西方近代哲學主要分為理性主義和經驗主義兩派,康德哲學的出現初步調和了兩派在認識論上的分歧。
康德解決的辦法是,顛倒以往主觀去符合客觀的基本認識,認為是客觀來符合主觀,這就是康德自稱的”哥白尼式的革命“。
1.?客觀符合主觀
所謂客觀符合主觀,并不是說對事物的認識完全由認識主體決定。客觀符合主觀,是說經驗得到的東西要經過主觀固有認識形式的”檢驗“,才能形成主體的認識。
這種固有認識形式不是哪個主體自己隨便決定的,而是思維本身固有的結構。
從某種程度上來說,客觀符合主觀,這里的”主觀“也是一種客觀(固有、不變)。如康德本人所說,他不是主觀唯心主義者。
2. 認識的來源
康德認為認識的來源包括經驗,但又不全是經驗,經驗必須經過主觀固有認識形式,即一張”知識之網“的過濾、判決后,才能形成認識。
這張知識之網是思維本身固有結構,這就保證了認識會具有普遍性。如此一來,經驗主義和理性主義一定程度上被康德糅合了。
3. 先驗的核心思想
先驗是先天的、、普遍的、固有的、絕對的。先驗先于經驗,有涉及經驗,是先天的先天,是知識的知識。
先驗固有在思維本身之中,給予了先天、知識可能性的討論,由此才有經驗、知識。
先驗的思想,表現了康德”哥白尼式的革命“的核心思想,即是有一種”先驗“來討論知識的可能性,那么從外物得到的經驗就必須通過”先驗“這一關,這才有了客觀服從主觀、對象服從主體,即”哥白尼式的革命“。
4. 先驗調和了理性主義和經驗主義
先驗是既先于經驗(先天),又與經驗有關,這是康德哲學的一個重要概念。康德在一定程度上調和了經驗主義和理性主義,其處理方法中最重要的一個就是”先驗“的概念。
先于經驗的”先驗“,是作為經驗的裁決者,作為知識的知識出現的,因為它考察的是”知識如何可能“。有了先驗來考察知識如何可能,直觀就可以對外物進行擇別。
知識是離不開經驗的,離不開外物的,這承認了經驗主義的觀點,另一方面,主觀卻要用先驗去裁決,去作為知識結構之網、知識結構只固有框架。
筆者思考:從某種程度上講,筆者認為先驗思想也調和了頻率統計推斷和貝葉斯統計推斷之間的鴻溝,讓基于數據驅動的機器學習和基于統計進行推斷的貝葉斯學習之間不在界限分明。先驗是一個偉大的理論創新。
Relevant Link:
https://baike.baidu.com/item/%E5%85%88%E9%AA%8C%E5%88%86%E6%9E%90%E5%88%A4%E6%96%AD/7101736 https://wenku.baidu.com/view/18cce387e53a580216fcfedd.html 《實踐理性批判》康德?
2. 主觀和客觀先驗
貝葉斯先驗可以分為兩類:
1. 客觀先驗:皆在讓數據最大程度地影響后驗; 2. 主觀先驗:讓領域專家來表達自己對先驗的個人看法;主觀先驗和客觀先驗是什么?如何精確定義某個先驗是否是客觀先驗呢?這個小節我們來一起看幾個例子,體悟一下主觀和客觀先驗的涵義。
0x1:客觀先驗
1. 扁平先驗
這是一種在整個未知參數范圍內的均勻分布。用扁平先驗意味著我們給每一個可能的值相等的權重,選擇這種類型的先驗我們稱之為無差別原理,我們沒有理由偏好某個具體數值。
扁平先驗在機器學習范疇中還有另一個名詞,叫最大熵原理,即當我們對未知參數的形式不確定時,應該將其初始化扁平均值形式。
在實際工程項目中,我們也一定常常有意無意地使用這個這種先驗,例如你將未知參數初始化為相等的均值,或者初始化為0。
2. 杰弗里斯先驗 - 建立一個不會因偶然改變變量位置而大幅變化的先驗
上一個小節,我們談到說扁平先驗是一個客觀先驗。但他真的是絕對客觀的嗎?
在某種程度上,我們所說的客觀是,一個不偏向后驗估計的先驗。扁平先驗看起來是一個合理的選擇,因為它對所有的參數賦予相同的概率。
但是扁平先驗不是變換不變的。假設我們有一個來自于伯努利分布 θ 的隨機變量 x,我們定義在 p(θ) = 1 上的先驗,如下圖所示:
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as statsx = np.linspace(0.000, 1, 150) y = np.linspace(1.0, 1.0, 150) lines = plt.plot(x, y, color="#A60628", lw=3) plt.fill_between(x, 0, y, alpha=0.2, color=lines[0].get_color()) plt.autoscale(tight=True) plt.ylim(0, 2)plt.show()現在,讓我們用函數來變換θ,這個變換函數的功能僅僅是在實軸上拉伸 θ。我們來看下,通過拉伸變換,先驗函數會變成什么樣呢?
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as statspsi = np.linspace(-10, 10, 150) y = np.exp(psi) / (1 + np.exp(psi)) ** 2 lines = plt.plot(psi, y, color="#A60628", lw=3) plt.fill_between(psi, 0, y, alpha=0.2, color=lines[0].get_color()) plt.autoscale(tight=True) plt.ylim(0, 1)plt.show()?從上圖中可以看到,原本的扁平先驗函數不再是平的!事實證明,扁平先驗也含有信息。
杰弗里斯先驗的意義是,建立一個不會因偶然改變變量位置而大幅變化的先驗。?
0x2:主觀先驗
如果我們對先驗的特定區域增大概率可能性,而對其他區域相應減小,這樣便將我們的推斷向具有更大可能性區域的參數偏倚。這被稱為一個主觀先驗,或信息先驗。
1. 對參數空間中特定區域有主觀偏倚的先驗分布
下圖中,主觀先驗描述了一個信念,即未知參數可能位于0.5附近,而不是在極點,而客觀鮮艷對此是不敏感的。
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as statscolors = ["#348ABD", "#A60628", "#7A68A6", "#467821"]x = np.linspace(0, 1) y1, y2 = stats.beta.pdf(x, 1, 1), stats.beta.pdf(x, 10, 10)p = plt.plot(x, y1,label='An objective prior \n(uninformative, \n"Principle of Indifference" )') plt.fill_between(x, 0, y1, color=p[0].get_color(), alpha=0.3)p = plt.plot(x, y2,label="A subjective prior \n(informative)") plt.fill_between(x, 0, y2, color=p[0].get_color(), alpha=0.3)p = plt.plot(x[25:], 2 * np.ones(25), label="another subjective prior") plt.fill_between(x[25:], 0, 2, color=p[0].get_color(), alpha=0.3)plt.ylim(0, 4)plt.ylim(0, 4) leg = plt.legend(loc="upper left") leg.get_frame().set_alpha(0.4) plt.title("Comparing objective vs. subjective priors for an unknown probability")plt.show()需要注意的是,使用主觀先驗不是總是意味著我們采用領域專家的主觀意見。更多時候,主觀先驗是對之前問題的后驗,可以理解為一個逐輪迭代優化的過程。在這輪統計中,我們基于新的數據更新這個后驗。
從某種程度上來說,像SGD、最大熵增優化算法等優化算法,其運行過程往往都是由很多輪”設定先驗-基于后驗結果更新下一輪的先驗“的子過程組成的。
2. 有限空間上的扁平先驗
如果我們對二項式里的先驗分布進行區間限制,即只有(0.5,1】內是均勻扁平分布,則這種先驗就不能稱之為客觀先驗,即使分布在(0.5,1】內為真正的”扁平“。
扁平先驗必須在整個參數范圍內扁平。
3. 從領域專家處獲得先驗分布
指定主觀經驗,是指將問題所在的領域知識結合到我們的數學框架中,融入領域知識可以帶來許多用處:
1. 有助于MCMC收斂:例如如果我們知道未知參數是嚴格為正的,那么我們可以縮小關注空間,從而省下在負值查找的時間; 2. 允許更準確的推斷:通過加權靠近真值的先驗,我們收窄我們的最終推斷; 3. 更好地表達了我們的不確定性;0x3:如何決策選擇主觀還是客觀先驗
選擇客觀或者主觀先驗主要取決于需要解決的問題,但也有少數情況會優先選擇某種先驗。
在科學研究中,科學家面對的往往是完全陌生的新領域,基于不會有任何的領域先驗,這時候選擇客觀先驗是顯而易見的,因為這消除了結論中的任何偏見。它應該讓兩個對研究主題有不同的信念的研究人員仍然覺得同一個客觀先驗是”公平“的。
我們必須記住:選擇先驗,無論是主觀的或者客觀的,扔是建模過程的一部分。
引用格爾曼的話:在模型已經擬合之后,應該檢查后驗分布,看看它是否有意義的。如果后驗分布沒有意義,這意味著樣本中額外的知識(信息)尚未包括在模型中,而且違背了已經使用的先驗分布的假設。這時候合適的做法是再回頭去改變先驗分布,使之與外部知識更加一致。
如果后驗分布看起來沒有意義,那么顯然你對后驗分布應該是怎樣的有了明確的認知,這意味著當前的先驗分布不包括所有的初始信息,應該更新。此時我們可以放棄當前的先驗,而選擇一個更能反映我們所有初始信息的先驗。
格爾曼同時建議,使用一個大邊界的均勻分布在大多數情況下是一個很好的客觀先驗選擇。
然后,人們應該警惕使用具有大邊界的均勻客觀先驗,因為它們會對極端不敏銳的數據點分配過大的先驗概率(因為實際情況可能是這些極端數據點應該被分配接近0的先驗概率)。
帶有大方差的正態隨機變量、或者在嚴格為正(或負)的情況下選帶有寬尾的指數變量可能是更好的選擇。
0x4:經驗貝葉斯 - 基于數據驅動的先驗選擇
經驗貝葉斯是結合了頻率論和貝葉斯推斷的技巧。
貝葉斯方法和頻率論方法之前顯著的差別在于,貝葉斯方法有一個帶超參數先驗分布,而經驗方法不具有任何先驗的概念。
經驗貝葉斯結合了這兩種方法,即使用頻率論方法來選擇先驗分布的超參數,然后用貝葉斯方法來進行后驗推斷。
1. 一個簡單的例子 - 估計模型超參數
假設我們希望估計方差 σ = 5 的正態分布的參數 μ,因為 μ 的范圍可以是所有實數,我們可以使用正態分布作為 μ 的先驗(這個正態分布和要估計的模型沒有關系)。接下來,我們必須選擇先驗的超參數,表示為,參數可以反映我們對先驗的不確定性,對于,我們有兩個選項
1. 經驗貝葉斯:使用經驗的樣本均值,這將使先驗居中于經驗樣本均值:
2. 傳統貝葉斯推斷:使用主觀先驗知識,或者更客觀的先驗(0均值和大的標準差)
相比于客觀貝葉斯推斷,經驗貝葉斯可以說是半客觀的,因為當前先驗模式(模型)的選擇是由我們確定的(因此是主觀的),而模型參數則僅由數據來確定(因此是客觀的)。
需要注意的是,使用這種方法需要非常慎重。從某種程度上來說,經驗貝葉斯方法是對數據重復計數。
這么理解這句話,我們使用了曾經在先驗中的數據,數據同時影響了先驗和后驗推斷,因而將影響針對觀測數據的結果,進而影響MCMC的推斷引擎中的結果。
這種重復計數會低估我們真正的不確定性,為了減少這種重復計數,我們只能在有很多觀測樣本時才使用經驗貝葉斯(大數定理),否則先驗將有過于強烈的影響,同時,如果可能的話,要保持適當的不確定性(通過設置大方差或其他等價方法)
筆者插入:?經驗貝葉斯也違反了貝葉斯推斷的哲學,教科書中的貝葉斯算法為:先驗 => 觀察數據 -> 后驗。而經驗貝葉斯的算法為:觀測數據 => 先驗 => 觀測數據 => 后驗。
理想情況下,所有的先驗應在觀測數據之前決定,以使數據不影響我們先驗的觀察。
Relevant Link:
https://www.zhihu.com/question/67846877/answer/257216646 《思考:快與慢》丹尼爾·卡尼曼 - 錨定相關主題?
3. 先驗的表現形式
這個章節筆者希望和大家一起討論先驗的本質以及常見表現形式,搞機器學習的同學對先驗這個詞應該不會陌生,它大量地出現在問題分析和模型設計過程中,例如:
1. 在模型設計中引入正則化技術:從貝葉斯的角度來看,正則化等價于對模型參數引入先驗分布。 2. 在特征工程中結合領域經驗設計特殊的特征向量:例如設計【身高、體重、握力、百米跑步速度】這幾位特征維度用于檢測學校男生還是女生,顯然樣本集在這種特征空間上是明顯可分的。在特征工程的階段就得到一個明顯可分的樣本集是非常值得高興的,因為這意味著我們的項目已經成功了90%,接下來的工作即使用隨機森林可能也能得到非常好的分類結果。 3. 在貝葉斯推斷中使用特定先驗概率分布函數 4. 模型參數初始化時人工設定特定的初始化值筆者認為:先驗的本質是約束。不管何種形式的先驗,其本質都是對參數空間搜索函數的牽引和回拉作用,使得最終的搜索結果在一定程度上受初始先驗的“影響”。
?
4. 貝葉斯分析中一些常用的先驗
這個章節我們將介紹在貝葉斯分析和方法中常用的一些先驗分布。 在開始討論之前,筆者希望先拋出一個問題和大家一起思考。為什么gamma分布、泊松分布可以作為先驗分布?有哪些標準決定了一個函數可以作為先驗分布?
筆者認為這個問題可以從幾個方面展開思考:
1. 思考gamma函數這類函數被發明的最早的原因,是因為其可以作為某個物理現象或當時的實際問題的數學模型; 2. 理論上,任意一個非負的可積函數,你都可以通過變換變成某個分布的密度函數; 3. 數學領域有句名言,數學是解開宇宙秘密的一把鑰匙,很多數學公式,你第一眼看到就會從心底產生一個感覺,哇!好美啊!好工整好對稱啊!這類數學模型往往可以抽象概括一大類物理現象,因此很自然地被作為先驗模型使用。0x1:二項分布 - N次二項實驗(只有兩種互斥結果的實驗)中的離散概率密度函數分布
二項分布就是重復n次獨立的伯努利試驗,在每次試驗中只有兩種可能的結果,而且兩種結果發生與否互相對立,并且相互獨立,與其它各次試驗結果無關,事件發生與否的概率在每一次獨立試驗中都保持不變,則這一系列試驗總稱為n重伯努利實驗,當試驗次數為1時,二項分布服從0-1分布。
1. 數學公式 - N次實驗中發生K次事件的”累計“概率
二項分布(Binomial Distribution),即重復n次的伯努利試驗(Bernoulli Experiment)。
如果在一次伯努利實驗中事件發生的概率是p,則不發生的概率1-p。
N次獨立重復試驗中發生k次的概率是:
記作:ξ~B(n,p)。期望:Eξ = np;方差:Dξ = np(1-p);
上圖中可以很清楚看到,n、p 這2個參數是如何影響二項分布函數的形狀的。
筆者插入:可以把人生比作二項分布,我們無時無刻不在進行選擇和決策,而選擇就是一種”向左走、向右走“的伯努利實驗,要獲得更大的期望(收獲),就要盡量擴大n,也就是一分耕耘一分收獲,另一方面,要盡可能提高在單個決策中的成功率,這樣,總體的方差才會小,我們才有更大的可能達到我們的人生目標。2. 公式的原理推導和理解
我們一起用一個拋硬幣游戲來理解二項分布概率公式的內涵。
1)等概率伯努利實驗
拋硬幣的結果有兩種,結果是正面(H);是結果是反面(T)。
在沒有特定定制硬幣的情況下,我們說:硬幣正面向上(H)的概率是 ? ;反面向上(T)的概率是 ?。
游戲開始后擲骰子:
很顯然,四?的概率是 1/6 (六面里有一面是四)。不是四的概率是 5/6 (六面里有五面不是四)。
現在問一個問題:拋一個公平的硬幣三次?…… 結果是兩個正面的概率是多少?
拋開數學公式的推導,我們先從實驗統計的角度來回答這個問題,拋一個公平的硬幣三次(H?是正面,?T?是反面)可以有 8?個結果:
"兩個正面" 可以是任何次序: "HHT"、"THH" 和 "HTH" 都有兩個正面(和一個反面)。所以3個結果有 "兩個正面"。
每個結果的可能性是一樣的,一共有 8 個可能,所以每個結果的概率是 1/8
所以結果是"兩個正面"這個事件的概率是:3? × ?1/8? = ?3/8?
我們繼續計算一下所有可能事件的發生概率:
- P(三個正面) = P(HHH) =?1/8
- P(兩個正面) = P(HHT) + P(HTH) + P(THH) = 1/8 + 1/8 + 1/8 =?3/8
- P(一個正面) = P(HTT) + P(THT) + P(TTH) = 1/8 + 1/8 + 1/8 =?3/8
- P(沒有正面) = P(TTT) =?1/8
?將概率分布畫在直方圖上:
注意到圖是對稱的,這個不是偶然,我們后面會談到,這和在單個伯努利實驗中的概率p有關。
我們進一步來思考上面這個推導過程的數學化表示,我們注意到N次實驗中發生K次事件本質上是一個排列組合問題,具體哪K次并不關注,所以我們可以用數列階乘的方式來計算總共的排列組合次數:
通常這個是叫 "n取k"。
我們重新計算一次拋 3次,結果有 2個 正面的排列組合:
所以結果是"兩個正面"這個事件的概率是:3? × ?1/8? = ?3/8 = 0.375
和我們人工統計得到的結果一樣,當然在數字小的情況下可以使用統計方式,當數字很大的時候就需要通過公式進行計算了。
2)非等概率伯努利實驗
在上面講的情況里,成功和失敗的可能性是相同的。可是,當硬幣有偏誤(不公平的硬幣)時,一面的可能性便會大于另一面。例如正面是70%,反面是30%。
還是進行3次實驗,我們通過樹圖的方式來看一下所有可能事件的概率結果:
圖中突出顯示了有 "兩個正面" 的結果。
將概率分布畫上直方圖上:
可以看到直方圖出現了偏置,這個偏置是由于概率p的不均等造成的。
將3個結果相加,得到"兩個正面"這個事件的概率是:3? ×? 0.147? =? 0.441。
接下來用數學公式來重新計算這個過程。
0.7 是正面的概率,稱它為 p; 其他的結果(反面)的概率是:1-p;一共有 n 個結果;2 是目標的結果個數,稱它為 k; 得到我們 "兩個正面" 的概率是:pk; 其他的結果的個數是:n-k; "其他的結果" 的概率是:(1-p)(n-k);所以所有的結果一同發生的概率是:
每個結果的概率
結果的總數是:
得到"兩個正面"這個事件的概率是:3? ×? 0.147? =? 0.441。??
3. 應用條件
1.各觀察單位只能具有相互對立的一種結果,如陽性或陰性,生存或死亡等,屬于兩分類資料; 2.已知發生某一結果(陽性)的概率為π,其對立結果的概率為1-π,實際工作中要求π是從大量觀察中獲得比較穩定的數值; 3.n次試驗在相同條件下進行,且各個觀察單位的觀察結果相互獨立,即每個觀察單位的觀察結果不會影響到其他觀察單位的結果。如要求疾病無傳染性、無家族性等;我們在使用二項分布對問題場景進行建模前需要特別思考上述條件,問題域是否滿足二項分布的先決條件。
同時還有一點需要讀者朋友們注意,二項分布和接下要要討論的泊松分布等分布,都是對順序不敏感的,即對N次實驗中發生K次的順序是不敏感的,如果你的問題場景中,還需要考慮到這K次具體發生的順序,則無法直接套用原始的二項分布公式。
Relevant Link:
https://www.shuxuele.com/data/binomial-distribution.html0x2:泊松分布 - n趨向無窮時的離散二項分布
Poisson分布,是一種離散概率分布,由法國數學家西莫恩·德尼·泊松(Siméon-Denis Poisson)在1838年時發表。
1. 數學公式
注意:泊松分布的公式和二項分布的公式是相同的,區別在于泊松分布在n趨向于無窮時,公式可以近似等于另一個計算等式。
泊松分布的參數λ是單位時間(或單位面積)內隨機事件的平均發生次數。
泊松分布的期望和方差均為。特征函數為?
上圖中可以很清楚看到,λ(樣本均值) 這個參數是如何影響泊松分布函數的形狀的。
2. 公式的原理推導和理解
公司樓下有家饅頭店,每天早上六點到十點營業,生意挺好,就是發愁一個事情,應該準備多少個饅頭才能既不浪費又能充分供應?
老板決定采用數據驅動的方式解決這個問題,先采集數據!老師統計了一周每日賣出的饅頭:
均值為:
按道理講均值是不錯的選擇(基于最小二乘的損失函數),但是如果每天準備5個饅頭的話,從統計表來看,至少有兩天不夠賣,?的時間不夠賣:
那怎么辦呢?很顯然,我們不能按照MAX值來準備,那么確實保險程度最高,但是浪費糧食的概率也很高。很顯然,這里需要基于概率推斷的思想,選擇一個有較高概率(95%)饅頭剛好夠供給的數字,問題是這個數字怎么算出來呢?
老板的解決策略是:用概率統計的方式解決問題,首先先將問題轉化為二項實驗問題,在二項分布的框架內進行思考和計算:
老板嘗試把營業時間抽象為一根線段,把這段時間用??來表示:
然后把周一的三個饅頭按照銷售時間放在線段上:
把??均分為四個時間段:
此時,在每一個時間段上,要不賣出了(一個)饅頭,要不沒有賣出:
可以看到在每個時間段,就有點像拋硬幣,要不是正面(賣出),要不是反面(沒有賣出)。此時,我們已經將某一天賣出多少饅頭的問題,轉換為了二項分布問題,我們來逐條回顧下二項分布的達成條件:
1. 每次試驗是獨立的:T內的每個時間段是否賣出饅頭都是條件獨立的; 2. 每個試驗只有兩個可能結果:賣出 or 不賣出; 3. 每個試驗里的 "成功" 概率是不變的:我們假定顧客購買這個行為是固定概率的;這樣,?內賣出3個饅頭的概率,就和拋了4次硬幣(4個時間段),其中3次正面(賣出3個)的概率一樣了。
這樣的概率通過二項分布來計算就是:
老板繼續思考,但是,當他把周二的七個饅頭放在線段上,分成四段就不夠了:
從圖中看,每個時間段,有賣出3個的,有賣出2個的,有賣出1個的,就不再是單純的“賣出、沒賣出”了。二項分布的結果唯一性條件不滿足了,不能套用二項分布了。
解決這個問題也很簡單,把??分為20個時間段,那么每個時間段就又變為了拋硬幣:
這樣,?內賣出7個饅頭的概率就是(相當于拋了20次硬幣,出現7次正面):
老板繼續思考,為了能一次性保證在一個時間段內只會發生“賣出、沒賣出”,干脆把時間切成??份,而且分得越細越好,用極限來表示:
接下來的是問題,在單個時間格內的概率p是多少?也即每次實驗中顧客是否購買饅頭的概率是多少?
在上面的假設下,問題已經被轉為了二項分布。二項分布的期望為:
那么:
那么 μ 怎么計算得到呢?
一個簡單的回答是,可以用歷史樣本均值(期望)計算得到:
可以用它來近似:
筆者插入:上面這樣計算的假設前提是,我們可以基于歷史數據來得出一個概率值,但是這里其實隱含了一個問題,只有在歷史數據滿足大數定理的時候(N很大,歷史統計數據足夠多)這個公式結果才是無偏的,否則這個計算結果可能是一個有偏結果,這個問題不影響我們理解概念,但是讀者朋友在實際項目中要注意。大數定理!大數定理!大數定理!
有了?了之后,我們繼續推導上面的二項分布公式,看看如何從二項公式演進到泊松分布公式:
我們來算一下這個極限:
其中:
?
所以:
上面就是泊松分布的概率密度函數,也就是說,在??時間內賣出??個饅頭的概率為:
一般來說,我們會換一個符號,讓??,所以:
這就是教科書中的泊松分布的概率密度函數,公式中λ是一個形狀參數,也等于均值和方差,可以這么理解,先驗樣本中的均值和方差,決定對應泊松分布的形狀。
帶入之前計算得到的 λ = 5,得到泊松分布公式:
畫出概率密度函數的曲線:
接下來就是概率推斷的問題了,需要反復強調的是,在概率推斷領域,我們無法得到一個100%的實值結果,而只能得到在某個結果下的概率,我們基于這個概率(例如大于95%)進行一個推斷和決策。
所以,基于上述泊松公式,老板接下來需要思考的問題是:我需要知道在93%的概率下,我準備的饅頭足夠供給,這就足夠滿足我店鋪的正常盈利了,另外7%算作小概率事件,可以忽略不計。
可以看到,如果每天準備8個饅頭的話,那么足夠賣的概率就是把前8個的概率加起來:
最終的決策就是:每天準備8個饅頭!問題得以解決。
3. 物理意義
泊松分布適合于描述單位時間(或空間)內隨機事件發生的次數的概率。如某一服務設施在一定時間內到達的人數,電話交換機接到呼叫的次數,汽車站臺的候客人數,機器出現的故障數,自然災害發生的次數,一塊產品上的缺陷數,顯微鏡下單位分區內的細菌分布數等等。
在實際事例中,當一個隨機事件,例如某電話交換臺收到的呼叫、來到某公共汽車站的乘客、某放射性物質發射出的粒子、顯微鏡下某區域中的白血球等等,以固定的平均瞬時速率λ(或稱密度)隨機且獨立地出現時,那么這個事件在單位時間(面積或體積)內出現的次數或個數就近似地服從泊松分布P(λ)。因此,泊松分布在管理科學、運籌學以及自然科學的某些問題中都占有重要的地位。(在早期學界認為人類行為是服從泊松分布,2005年在nature上發表的文章揭示了人類行為具有高度非均勻性。)
Relevant Link:
https://blog.csdn.net/ccnt_2012/article/details/81114920 https://baike.baidu.com/item/%E6%B3%8A%E6%9D%BE%E5%88%86%E5%B8%83/1442110?fr=aladdin https://blog.csdn.net/ccnt_2012/article/details/811149200x3:正態分布 - 連續概率密度分布
正態分布(Normal distribution),也稱“常態分布”,又名高斯分布(Gaussian distribution),最早由A.棣莫弗在求二項分布的漸近公式中得到。C.F.高斯在研究測量誤差時從另一個角度導出了它。
正態曲線呈鐘型,兩頭低,中間高,左右對稱因其曲線呈鐘形,因此人們又經常稱之為鐘形曲線。
1. 數學公式
若隨機變量 X 服從一個位置參數為?μ、尺度參數為?σ 的概率分布,且其概率密度函數為:
則這個隨機變量就稱為正態隨機變量,正態隨機變量服從的分布就稱為正態分布,記作?,數學期望為μ、方差為σ^2。
特別的,當時,正態分布就成為標準正態分布:
2. 圖形特征
上圖中可以很清楚看到,μ, σ 這兩個參數是如何影響正態分布函數的形狀的。
1. 集中性:正態曲線的高峰位于正中央,即均數所在的位置。 2. 對稱性:正態曲線以均數為中心,左右對稱,曲線兩端永遠不與橫軸相交。 3. 均勻變動性:正態曲線由均數所在處開始,分別向左右兩側逐漸均勻下降。3. 物理意義
正態分布有極其廣泛的實際背景,生產與科學實驗中很多隨機變量的概率分布都可以近似地用正態分布來描述。一般來說,如果一個量是由許多微小的獨立隨機因素影響的結果,那么就可以認為這個量具有正態分布。
在筆者所在的網絡安全領域,我們可以假設一臺機器在歷史上一個月的網絡QPS滿足正態分布,因為在每個時刻,網絡QPS是由很多因素累計決定的(網絡抖動、應用負載變化、網絡入侵等),通過正態分布對歷史的網絡QPS進行建模,從而對未來的網絡外聯QPS進行異常檢測。?
Relevant Link:?
https://www.zhihu.com/question/26854682 https://baike.baidu.com/item/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83/829892?fr=aladdin0x4:Gamma(伽馬)分布?- 連續概率函數
伽瑪分布(Gamma Distribution)是統計學的一種連續概率函數,記為,是一個正實數的隨機變量,它是概率統計中一種非常重要的分布。
1. 數學公式
密度函數為:
期望和方差分別為:?
Gamma分布中的參數α稱為形狀參數(shape parameter),β稱為逆尺度參數(scale parameter)。
2.?變化趨勢
伽馬分布的概率密度函數取決于形狀參數??的數值:
當??時,?為遞減函數;
當??時,?為遞增函數;
當??時,?為單峰函數;
當 α=1 時,伽馬分布就是參數為 β 的指數分布,X~Exp(β); 當α=n/2,β=2時,伽馬分布就是自由度為n的卡方分布,X^2(n); # -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as statsfigsize(12.5, 5) gamma = stats.gammaparameters = [(1, 0.5), (9, 2), (3, 0.5), (7, 0.5)] x = np.linspace(0.001, 20, 150) for alpha, beta in parameters:y = gamma.pdf(x, alpha, scale=1. / beta)lines = plt.plot(x, y, label="(%.1f,%.1f)" % (alpha, beta), lw=3)plt.fill_between(x, 0, y, alpha=0.2, color=lines[0].get_color())plt.autoscale(tight=True)plt.legend(title=r"$\alpha, \beta$ - parameters")plt.show()Relevant Link:?
https://www.cnblogs.com/coshaho/p/9653460.html https://www.cnblogs.com/alps/p/5601300.html https://www.zhihu.com/question/34866983/answer/605418470x5:威沙特分布
除了標量的隨機變量之外,隨機變量還可以是矩陣形式的!具體地說,威沙特分布是所有半正定矩陣的分布。
合適的協方差矩陣是正定的,因此該威沙特分布是一個協方差矩陣的適當的先驗,我們在下圖中,繪制一個來自 4 x 4 和 15 x 15 威沙特分布的某些實現
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as statsfigsize(12.5, 5)n = 4 for i in range(10):ax = plt.subplot(2, 5, i + 1)if i >= 5:n = 15plt.imshow(stats.wishart.rvs(n + 1, np.eye(n)), interpolation="none",cmap="hot")ax.axis("off")plt.suptitle("Random matrices from a Wishart Distribution")plt.show()有一點需要注意的是這些矩陣的對稱性,它反映了協方差的對稱性。
0x6:Beta分布?
1. 數學公式?
在概率論中,貝塔分布,也稱B分布,是指一組定義在??區間的連續概率分布,有兩個參數??。
Β分布的概率密度函數是:
其中??是?Γ函數。隨機變量 X 服從參數為??的Β分布通常寫作:
2. 變化趨勢
α,β參數決定了Beta分布的形狀:
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as statsfigsize(12.5, 5)params = [(2, 5), (1, 1), (0.5, 0.5), (5, 5), (20, 4), (5, 1)]x = np.linspace(0.01, .99, 100) beta = stats.beta for a, b in params:y = beta.pdf(x, a, b)lines = plt.plot(x, y, label = "(%.1f,%.1f)"%(a,b), lw = 3)plt.fill_between(x, 0, y, alpha = 0.2, color = lines[0].get_color())plt.autoscale(tight=True) plt.ylim(0) plt.legend(loc = 'upper left', title="(a,b)-parameters")plt.show()上圖中有一點請讀者朋友注意,當指定參數為(1,1)時,Beta分布等同于扁平分布,它是一種均勻分布。
因此,Beta分布是均勻分布的更一般形式。
3. Beta分布特性
1. 作為概率的概率分布,Beta(a, b)在(0, 1)上對 θ 積分必定為1; 2. Beta(a, b)同時能作為先驗分布和后驗分布,能夠模擬各種概率分布情況; 3. Beta分布可以模擬出以(0, 1)上任意點為峰值的曲線,這表明Beta分布可以模擬極大似然法求出的任意最大值點概率值;Relevant Link:?
https://baike.baidu.com/item/%E8%B4%9D%E5%A1%94%E5%88%86%E5%B8%83/8994021?fr=aladdin http://www.cnblogs.com/coshaho/p/9658135.html0x7:共軛先驗
1. 什么是共軛先驗
在貝葉斯概率理論中,如果后驗概率P(θ|x)和先驗概率p(θ)滿足同樣的分布律,那么,先驗分布和后驗分布一起被叫做共軛分布(彼此是對方的共軛),同時,先驗分布叫做似然函數的共軛先驗分布。
假定 X 來自或被認為是來自一個著名的分布,稱之為 fa,其中?a 可能是 f 的未知參數(f 可以是一個正態分布或者二項分布)。對于特定的 fa,如果存在先驗分布 pβ,使得:
其中,是一組不同的參數,但 p 是和先驗相同的分布。
滿足該關系的先驗 p 稱為共軛先驗。
2. 共軛先驗的性質
1. 代數上的方便性,可以在建模時直接給出后驗分布的封閉形式,否則的話只能數值計算(例如SGD啟發式搜索)。 2. 可以形成一個先驗鏈,即現在的后驗分布可以作為下一次計算的先驗分布,如果形式相同,就可以形成一個鏈條。 3. 一切指數族分布成員都存在一個共軛先驗。1)在伯努利分布中,共軛先驗是 Beta 分布;2)在高斯分布中,均值的共軛先驗是高斯分布,精度的共軛先驗是Wishart分布;3. 共軛先驗的局限
1. 共軛先驗是不客觀的,因此,它只有當需要主觀先驗時才有用。不能保證共軛先驗能夠顧忌開發者的主觀意識; 2. 對于簡單的一維問題,通常存在共軛先驗。但是對于更大更復雜的問題,涉及更復雜的結構,基本沒希望找到共軛先驗;4. 一個例子:Beta先驗+二項分布數據 = Beta后驗分布?
Beta分布和二項分布之間有一個有趣的關系。假設我們感興趣的是一些未知的比例或者概率 p。我們設定它符合一個Beta(α,β) 先驗分布,然后我們通過觀察收集一個由二項式過程 X~B(N,p) 昌盛的數據,其中 p 仍然是未知的,后驗分布仍然是Beta分布,即:p | X ~ Beta(a+X,β+N-X)
一個Beta先驗分布連同二項式生成的觀測數據形成一個Beta后驗分布。這是一個非常有用的性質,無論是從計算的角度還是啟發性的角度。
具體地說,如果我們設 p(一個均勻分布)的先驗為 Beta(1,1),觀察?X ~ B(N,p)的數據,我們得到的后驗是 Beta(1+X,1+N-X)。
例如,如果我們在 N=25 次試驗里觀察到 X=10 次成功,那么我們關于 p 的后驗是?Beta(1+10,1+25-10)= Beta(11,16)的分布。
Relevant Link:??
https://www.jianshu.com/p/8de4fd24e53c0x8:各個分布之間的推演和轉化關系:
1. 二項分布和泊松分布的關系
在 n 重伯努利實驗中,事件A在每次實驗中發生的概率為 Pn,在小數據情況下,Pn與實驗次數有關。如果= λ > 0,則泊松公式可由二項分布公式推導得到新的表達等式:
由定理可知,當二項分布 b(n, p) 的參數 n 很大,p 很小,而 λ = np 大小適中時(實際中,n=>100, p<=0.1, np<=10時),二項分布可用參數為 λ=np 的泊松分布來近似(也即滿足大數定理時)。
這就是二項分布的泊松逼近,當然 n 應該盡可能地大,否則近似效果往往不佳。
二項分布的泊松近似常常被應用于研究稀有事件(即每次實驗中事件出現的概率p很小),當伯努利實驗的次數n很大時,事件發生的頻數分布近似于泊松分布的頻數分布。
實際表明,在一般情況下,當 p<0.1 時,這種近似是很好的,甚至n不必很大都可以,當然p越小,n相對就會增大,這是期望公式的限定。下圖中,當 p=0.01,n=2,我們對比了二項分布和泊松分布的頻數分布
通過概率分布圖可以看出這個近似,當二項分布的??很小的時候,兩者比較接近:
也可以從另一個方面理解,當 n 趨向無窮大的時候,才能滿足將隨機事件切位為單獨的小的時間格,在每個時間塊中,獨立伯努利條件才能成立,這個時候二項分布進化為泊松分布。
二項分布和泊松分布的關系,就是從小數據到大數據時,大數定律逐漸占據主導地位的轉變。在N趨近于無窮時,統計可以近似等同于概率。
2. 二項分布和正態分布的關系
如果n很大,函數分布最終成正態分布,二項分布的極限分布為正態分布。故當n很大時,二項分布的概率可用正態分布的概率作為近似值。
3. 泊松分布和正態分布的關系?
二項分布既可以用泊松分布近似,也可以用正態分布近似。顯然,泊松分布和正態分布在一定條件下也具有近似關系。
對任意的 a < b:
,其中,
4. 用泊松分布還是正態分布來近似二項分布?
二項分布的泊松近似和正態近似各自適用的條件是不同的。?
1. 當 p 很小時,即使 n 不是很大,用泊松分布近似二項分布,已經相當吻合。但是在這種情況下,如果用正態分布來近似就會造成較大的誤差; 2. 當 n 充分大,p 既不接近于0也不接近于1時(最好滿足 0.1<=p<0.9),正態分布可以較好地近似二項分布;Relevant Link:
https://wenku.baidu.com/view/5d9ac306e87101f69e3195e4.html https://www.zybang.com/question/dcdea243cfc493eac4dde9eb4c05b373.html https://baike.baidu.com/item/%E4%BC%BD%E9%A9%AC%E5%88%86%E5%B8%83/7245468?fr=aladdin https://baike.baidu.com/item/Gamma%E5%88%86%E5%B8%83/1033808 http://www.cnblogs.com/JustForCS/p/5264315.html https://blog.csdn.net/u012279165/article/details/73693157 https://baike.baidu.com/item/%E4%BA%8C%E9%A1%B9%E5%88%86%E5%B8%83/1442377?fr=aladdin http://www.360doc.com/content/17/1231/22/9200790_718001949.shtml?
5. 數據量N和先驗分布對最終后驗的綜合決策
0x1:通過乘積公式體現數據量和先驗分布對后驗估計的動態制衡作用
在機器學習中有一個被廣泛接受的觀點,我們擁有的數據越多、數據量越多,先驗就越不重要,這是符合直覺的。畢竟,我們的先驗也是基于以前的信息,足夠多的新信息完全可以替代我們以前信息的價值,因為規律永遠蘊含在數據中,只要擁有數據,就可以不斷從中提取出信息。
同時,足夠多的數據對先驗的修正也是有幫助的,如果我們的先驗明確是錯誤的,那么數據的自我修正性質將呈現給我們一個不那么錯的后驗估計結果。
我們可以從數學上闡述上面的觀點。給定數據集 X,對參數?θ 的后驗分布可以寫作:
寫成對數形式:
對數似然函數會隨著樣本量而變化,因為它是數據的一個函數;
但是先驗的密度函數不會隨著數據而變化;
因此,當樣本量增加時,的絕對值會變大,但保持不變。
因此,隨著樣本量增加,整體函數更多地受到的影響,所選擇的先驗的影響會變小。
因此,只要非零概率的區域是相同的,那么推斷的收斂和先驗無關。
0x2:選擇退化的先驗
只要先驗在某個區域有非零的概率,通過N數據量的訓練后,后驗就可以在這個區域有任何可能的概率。
但是!當某個區域先驗概率初始值為0時,無論輸入多少的數據,后驗都無法在這個區域得到任何概率了。從數學公式上很容易理解,這是由于乘法的性質決定的。
我們用一個小實驗來說明,假設我們的數據是伯努利分布,我們希望估計p(成功的概率),我們現在選擇一個”不合適“的先驗 Uniform(0.5,1),這里說不合適是應該我們事先知道了數據的實際分布,真實項目場景中當然不可能有這種好事,這里僅僅是為了說明先驗分布選錯了會帶來什么影響。
我們已知了數據的真實分布,但是我們選的先驗在真實值0.35處的概率為0,我們來看下mcmc推斷的結果會如何:
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as stats import pymc as pmfigsize(12.5, 15)p_actual = 0.35 x = np.random.binomial(1, p_actual, size=100) print x[:10]p = pm.Uniform('p', 0.5, 1) obs = pm.Bernoulli('obs', p, value=x, observed=True)mcmc = pm.MCMC([p, obs]) mcmc.sample(10000, 2000)p_trace = mcmc.trace('p')[:] plt.xlabel('Value') plt.ylabel('Density') plt.hist(p_trace, bins=30, histtype='stepfilled', normed=True)plt.show()從上圖中可以看到,后驗分布大量堆積在先驗的下界。在數據的作用下,后驗分布在”極力“靠近真值,但是因為先驗分布的下界之外是0概率,后驗概率無法改變。
如果在實際項目中看到了類似的情況,很有可能說明你的先驗假設不太正確。
0x3:一個例子說明數據對先驗的修正作用
下面通過一個例子來說明本小節觀點。考察兩個二項分布參數?θ 的后驗的收斂,一個是扁平先驗,一個是朝著 0 偏移的先驗。當樣本量增加時,它們的后驗收斂,因此其推斷也收斂。
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as stats import pymc as pmfigsize(12.5, 15)p = 0.6 beta1_params = np.array([1.,1.]) beta2_params = np.array([2,10]) beta = stats.betax = np.linspace(0.00, 1, 125) data = stats.bernoulli.rvs(p, size=500)plt.figure() for i,N in enumerate([0,4,8, 32,64, 128, 500]):s = data[:N].sum()plt.subplot(8,1,i+1)params1 = beta1_params + np.array([s, N-s])params2 = beta2_params + np.array([s, N-s])y1,y2 = beta.pdf(x, *params1), beta.pdf( x, *params2)plt.plot(x,y1, label = r"flat prior", lw =3)plt.plot(x, y2, label = "biased prior", lw= 3)plt.fill_between(x, 0, y1, color ="#348ABD", alpha = 0.15)plt.fill_between(x, 0, y2, color ="#A60628", alpha = 0.15)plt.legend(title = "N=%d" % N)plt.vlines(p, 0.0, 7.5, linestyles = "--", linewidth=1)#plt.ylim( 0, 10)#plt.show()Relevant Link:?
《貝葉斯方法》?
6. 貝葉斯多臂游戲機問題
0x1:游戲規則
假設你面對10臺游戲機機(多臂游戲機)。每臺游戲機會以某種概率發獎金,每臺游戲機的獎金相同,只是概率不同。有些游戲機非常大方,有些則很少。當然,游戲參與者事先不知道這些概率。
我們每次僅能選擇一個游戲機,我們的任務是制定一個策略,贏取最多的獎金。
當然,如果我們知道哪臺游戲機擁有最大的概率,然后總是挑這臺,必定會產生最多的獎金。因此,我們的任務可以表述為”盡快找出最好的游戲機“。
該任務因為游戲機的隨機性而變得復雜,在偶然情況下,次優的游戲機也可以返回許多獎金,這可能使得我們相信,這就是最優的那臺。同樣,在偶然的情況下,最好的游戲機也可能返回很低的獎金。
我們是應該繼續嘗試那臺在本輪失敗的機器,還是放棄挑選另一臺?
一個更為棘手的問題是,如果我們發現了一臺返回獎金相當不錯的游戲機,我們是繼續依靠它維持我們相當不錯的成績,還是嘗試其他機器以期找到一個更好的游戲機?
這就是著名的探索與利用困境。
0x2:該問題的現實意義
探索與利用困境并不是數學家虛構的數字游戲,它在我們的日常生產生活中處處可見。
1. 互聯網展示廣告:公司有一系列可以展示給潛在客戶的廣告,但該公司并不清楚要遵循哪些廣告策略,以最大限度地提高銷售。 2. 生態學:動物只有有限的能量用于耗費,而且某些行為帶來的回報是不確定的。動物如何最大化其適應度? 3. 金融:在隨時間變化的回報量中,哪些股票期權能給出最高的回報? 4. 臨床試驗:一位研究人員希望在眾多的方案中找出最好的治療方案,同時最大限度地減少損失。 5. 心理學:賞罰如何影響我們的行為?人類如何學習?0x3:游戲策略
1. 選擇先驗分布
該算法開始于一個完全無知的狀態,它什么都不知道,并開始通過測試系統來獲取數據。在獲取數據和結果上,它可以學習什么是最好的和最差的行為。?
貝葉斯解決方案首先假定每個游戲機發獎金的先驗概率。因為我們假定對這些概率完全無知,所以自然的,我們采用0到1的扁平分布(Beta分布)。
2. 算法流程
我們將10臺游戲機抽象為x軸上【0,9】10個坐標數字,對應的,每個游戲機本輪的抽獎結果作為y值,這樣,所有游戲機的抽獎作為就【x,y】坐標化了。
1. 首輪游戲:對所有游戲機(這里N=10臺)設定一個扁平先驗,也即初始化階段是零知識的,對10臺游戲機隨機進行一次抽取即可; 2. 獲取本輪樣本數據:選擇本輪抽取中,樣本值最高的游戲機 b,即選擇 B = argmax Xb,根據那個樣本值最高的游戲機 b 的樣本結果,作為本輪試驗的樣本數據,【x,y】,x代表第幾胎游戲機,y代表對應的值。 3. 更新后驗:基于本輪的樣本數據【x,y】更新先驗分布,這可以理解為一個后驗修正過程; 4. 重復2-3過程;這個算法包含的思想是:我們不應該直接放棄目前結果不理想的游戲機,而是隨著我們建立的信念認為還有更好的游戲機,應該以一定的下降概率去選擇它們。隨著玩的次數逐漸增多,不好的游戲機的概率會下降,好的游戲機的概率會上升。
3. MCMC推斷所有游戲機的發獎率后驗分布
我們在代碼中人工設定的真值隱含概率為:[0.85, 0.60, 0.75]。
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as stats import pymc as pmrand = np.random.randclass Bandits(object):"""This class represents N bandits machines.parameters:p_array: a (n,) Numpy array of probabilities >0, <1.methods:pull( i ): return the results, 0 or 1, of pullingthe ith bandit."""def __init__(self, p_array):self.p = p_arrayself.optimal = np.argmax(p_array)def pull(self, i):# i is which arm to pullreturn np.random.rand() < self.p[i]def __len__(self):return len(self.p)class BayesianStrategy(object):"""Implements a online, learning strategy to solvethe Multi-Armed Bandit problem.parameters:bandits: a Bandit class with .pull methodmethods:sample_bandits(n): sample and train on n pulls.attributes:N: the cumulative number of sampleschoices: the historical choices as a (N,) arraybb_score: the historical score as a (N,) array"""def __init__(self, bandits):self.bandits = banditsn_bandits = len(self.bandits)self.wins = np.zeros(n_bandits)self.trials = np.zeros(n_bandits)self.N = 0self.choices = []self.bb_score = []def sample_bandits(self, n=1):bb_score = np.zeros(n)choices = np.zeros(n)for k in range(n):# sample from the bandits's priors, and select the largest samplechoice = np.argmax(np.random.beta(1 + self.wins, 1 + self.trials - self.wins))# sample the chosen banditresult = self.bandits.pull(choice)# update priors and scoreself.wins[choice] += resultself.trials[choice] += 1bb_score[k] = resultself.N += 1choices[k] = choiceself.bb_score = np.r_[self.bb_score, bb_score]self.choices = np.r_[self.choices, choices]returnfigsize(11.0, 10)beta = stats.beta x = np.linspace(0.001,.999,200)def plot_priors(bayesian_strategy, prob, lw = 3, alpha = 0.2, plt_vlines = True):## plotting functionwins = bayesian_strategy.winstrials = bayesian_strategy.trialsfor i in range(prob.shape[0]):y = beta(1+wins[i], 1 + trials[i] - wins[i])p = plt.plot(x, y.pdf(x), lw = lw)c = p[0].get_markeredgecolor()plt.fill_between(x,y.pdf(x),0, color = c, alpha = alpha,label="underlying probability: %.2f" % prob[i])if plt_vlines:plt.vlines(prob[i], 0, y.pdf(prob[i]) ,colors = c, linestyles = "--", lw = 2)plt.autoscale(tight = "True")plt.title("Posteriors After %d pull" % bayesian_strategy.N +\"s"*(bayesian_strategy.N > 1))plt.autoscale(tight=True)returnhidden_prob = np.array([0.85, 0.60, 0.75]) bandits = Bandits(hidden_prob) bayesian_strat = BayesianStrategy(bandits)draw_samples = [1, 1, 3, 10, 10, 25, 50, 100, 200, 600]for j,i in enumerate(draw_samples):plt.subplot(5, 2, j+1)bayesian_strat.sample_bandits(i)plot_priors(bayesian_strat, hidden_prob)#plt.legend()plt.autoscale(tight = True) plt.tight_layout()plt.show()請注意,我們并不是真正關心對隱含概率的精確估計,這點和機器學習中的回歸預測是不同的。
我們更感興趣的是選擇最好的游戲機,或者更準確地說,更有信心地選擇最好的游戲機。
出于這樣的原因,紅色游戲機的分布很寬,這代表了我們對隱含概率所知甚少,即從樣本數據中提取到的信息有限,或者說樣本數據給我們的先驗帶來的熵減很小。我們有充足的理由相信,紅色游戲機不是最好的,所以選擇忽略它。
另一方面,經過1000輪之后,大多數藍色游戲機遙遙領先,因此我們幾乎總是選擇這臺游戲機。這是一件好事,因為它經常能帶來較好的回報。
4. 定義損失函數
上一小節我們得到所有游戲機的后驗概率分布,也大致知道了該如何選游戲機,但這是不夠的。我們的目標不是玩數字游戲,我們的目標是確確實實地給出一個可以落地執行的游戲機選擇策略,類似這樣的,【藍色,藍色,綠色,藍色.....藍色】這種序列。
要回答這個問題,就需要在概率分布和實際問題之間搭起一個橋梁,即損失函數,通過損失函數的數值化評估來得出最佳的后驗策略。
我們需要一個指標來計算我們做的如何。理論上說,絕對最好的方法是始終挑那個獲勝概率最大的游戲機。
記這臺最好的游戲機的贏的概率為Wopt,我們可以定義一個理論的總遺憾,表示如果從一開始就選擇最好的游戲機,和我們每輪實際選擇的游戲機,這兩種選擇之間在收益上的差距。
在此公式中,Wb(i) 是所選游戲機在第 i 輪出獎的概率。
很顯然,總遺憾為0意味著該策略獲得最好的成績,但這幾乎是不太可能的,因為一開始我們的算法往往會做出錯誤或者不那么好的選擇,只是隨著輪數的增加,算法做出正確選擇的概率逐漸增大。
理想情況下,總遺憾應該扁平化,因為它逐漸學習到最好的游戲機,即找到最好的后驗分布對應的游戲機,這意味著我們常常能收斂到 Wb(i) = Wopt。
5. 選擇游戲策略
我們已經可以得到不同游戲機的后驗分布,這可以作為每輪選擇的參考,但具體怎么選,依賴于我們選擇的游戲策略。同時我們也有了損失評估函數,可以實時地看到每一輪選擇后的損失。
在下面的代碼中,我們對比了在不同的游戲策略下,總遺憾的函數曲線:
1. 隨機:顧名思義,類似于丟色子,這顯然不明智,如果用隨機策略,就沒必要費那么大勁去統計樣本以及計算游戲機的后驗分布了; 2. 貝葉斯的最大置信邊界:選擇底層概率的95%置信區間的最大上界的游戲機; 3. 貝葉斯-UCB算法:選擇有最大得到的游戲機,其中得分是一個動態的后驗分布的分位數; 4. 后驗均值:選擇具有最大后驗均值的游戲機; 5. 最大比例:選擇目前觀測到的贏的比例最大的游戲機;代碼:
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as stats import pymc as pmrand = np.random.randfigsize(12.5, 5) from other_strats import *#define a harder problem hidden_prob = np.array([0.15, 0.2, 0.1, 0.05]) bandits = Bandits(hidden_prob)#define regret def regret(probabilities, choices):w_opt = probabilities.max()return (w_opt - probabilities[choices.astype(int)]).cumsum()#create new strategies strategies= [upper_credible_choice,bayesian_bandit_choice,ucb_bayes ,max_mean,random_choice] algos = [] for strat in strategies:algos.append(GeneralBanditStrat(bandits, strat))# train 10000 times for strat in algos:strat.sample_bandits(10000)# test and plot for i, strat in enumerate(algos):_regret = regret(hidden_prob, strat.choices)plt.plot(_regret, label=strategies[i].__name__, lw=3)plt.title("Total Regret of Bayesian Bandits Strategy vs. Random guessing") plt.xlabel("Number of pulls") plt.ylabel("Regret after $n$ pulls"); plt.legend(loc="upper left")plt.show()?從上圖中可以看到,除了隨機和后驗均值策略之外,其他策略的總遺憾是逐漸收斂的,這表示了我們正在實現較優的選擇。
6. 評估總遺憾期望
上個小節中,我們已經得到了3種游戲策略,都在總遺憾函數上呈現出了收斂的趨勢。但是為了更科學,以消除任何可能的運氣成分,我們應該看一下總遺憾期望。它定義為所有可能場景的總遺憾的期望值:
可以證明,任何次優策略的總遺憾期望都有對數形式的下界(從原始函數對數形式收斂來理解)。形式為:
因此,任何符合對數增加遺憾的策略,都可以稱之為解決了多臂游戲機問題。
使用大數定理,我們可以通過進行很多次同樣的實驗來近似貝葉斯游戲機的總遺憾期望。
為了對不同策略間的差異性有一個更好的比較,我們在對數尺度中繪制了函數圖:
# -*- coding: utf-8 -*-import numpy as np from IPython.core.pylabtools import figsize import matplotlib.pyplot as plt import scipy.stats as stats import pymc as pmrand = np.random.randfigsize(12.5, 5) from other_strats import *#define a harder problem hidden_prob = np.array([0.15, 0.2, 0.1, 0.05]) bandits = Bandits(hidden_prob)#define regret def regret(probabilities, choices):w_opt = probabilities.max()return (w_opt - probabilities[choices.astype(int)]).cumsum()#create new strategies strategies= [upper_credible_choice,bayesian_bandit_choice,ucb_bayes ,max_mean,random_choice]trials = 500 expected_total_regret = np.zeros((10000, 3))for i_strat, strat in enumerate(strategies[:-2]):for i in range(trials):general_strat = GeneralBanditStrat(bandits, strat)general_strat.sample_bandits(10000)_regret = regret(hidden_prob, general_strat.choices)expected_total_regret[:, i_strat] += _regretplt.plot(expected_total_regret[:, i_strat] / trials, lw=3, label=strat.__name__)[pl1, pl2, pl3] = plt.plot(expected_total_regret[:, [0,1,2]], lw = 3) plt.xscale("log") plt.legend([pl1, pl2, pl3],["Upper Credible Bound", "Bayesian Bandit", "UCB-Bayes"],loc="upper left") plt.ylabel("Exepected Total Regret \n after $\log{n}$ pulls"); plt.title( "log-scale of above" ); plt.ylabel("Exepected Total Regret \n after $\log{n}$ pulls");plt.show()0x4:算法擴展
1. 添加學習速率
我們能夠通過加入一個學習速率項(就像深度學習中那樣),促進該算法更快地更新去學習變化的環境
1. 如果rate<1,則該算法將更快地忘記先前的獲勝,并且會有一個走向無知的下行壓力; 2. 如果rate>1,則意味著算法將以風險較高的方式運行,而且更經常地把賭注壓在早期贏的游戲機上,對不斷變化的環境更有韌性;2. 層次算法
我們可以在較小的游戲機算法之上再建立一個貝葉斯游戲機算法。即再建立一個貝葉斯游戲機模型,用于選擇選擇哪個子模型。原理上類似決策樹和隨機森林的概念。?
??
轉載于:https://www.cnblogs.com/LittleHann/p/10383787.html
總結
以上是生活随笔為你收集整理的谨慎选择我们的先验 - 对最优拟合概率分布搜索空间的一种约束的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【网络实验】10G网络下的真实带宽——C
- 下一篇: C++求泊松分布