謹慎選擇咱們的先驗 - 對最優擬合機率分佈搜索空間的一種約束

1. 哲學上先驗的概念

先驗,是康德哲學中的重要概念,它並非單純在機器學習或者說AI中特定的專有名詞,實際上很是多學科中都包含有先驗(prior)後驗(posterior)的概念。html

在學習貝葉斯推斷統計的先驗概念以前,咱們這章先來了解一些簡單的歷史。算法

0x1:人類知性的組成

咱們的知性有兩方面的功能:安全

1. 一是邏輯功能:邏輯功能在知識的基礎上規定着思惟的判斷形式,這是形式邏輯的範圍;
2. 一是認識功能:認識功能則爲咱們提供新的知識,這是「先驗邏輯」的領域;

自亞里士多德以來,咱們的形式邏輯已經至關完備了,沒有人懷疑形式邏輯是廣泛必然的亦即「先天的」,於是爲形式邏輯提供知識內容的先驗邏輯也必定是先天的,由於它是形式邏輯的基礎。網絡

因此,形式邏輯先驗邏輯是對應的,在每個判斷形式的背後都有某種先驗的要素做爲它的基礎,這種先驗要素就是「範疇」。app

0x2:康德」哥白尼式的革命「

康德以前,西方近代哲學主要分爲理性主義和經驗主義兩派,康德哲學的出現初步調和了兩派在認識論上的分歧。
康德解決的辦法是,顛倒以往主觀去符合客觀的基本認識,認爲是客觀來符合主觀,這就是康德自稱的」哥白尼式的革命「。框架

1. 客觀符合主觀

所謂客觀符合主觀,並非說對事物的認識徹底由認識主體決定。客觀符合主觀,是說經驗獲得的東西要通過主觀固有認識形式的」檢驗「,才能造成主體的認識。
這種固有認識形式不是哪一個主體本身隨便決定的,而是思惟自己固有的結構。
從某種程度上來講,客觀符合主觀,這裏的」主觀「也是一種客觀(固有、不變)。如康德本人所說,他不是主觀惟心主義者。dom

2. 認識的來源

康德認爲認識的來源包括經驗,但又不全是經驗,經驗必須通過主觀固有認識形式,即一張」知識之網「的過濾、判決後,才能造成認識。
這張知識之網是思惟自己固有結構,這就保證了認識會具備廣泛性。如此一來,經驗主義和理性主義必定程度上被康德糅合了。機器學習

3. 先驗的核心思想

先驗是先天的、、廣泛的、固有的、絕對的。先驗先於經驗,有涉及經驗,是先天的先天,是知識的知識。
先驗固有在思惟自己之中,給予了先天、知識可能性的討論,由此纔有經驗、知識。
先驗的思想,表現了康德」哥白尼式的革命「的核心思想,便是有一種」先驗「來討論知識的可能性,那麼從外物獲得的經驗就必須經過」先驗「這一關,這纔有了客觀服從主觀、對象服從主體,即」哥白尼式的革命「。函數

4. 先驗調和了理性主義和經驗主義

先驗是既先於經驗(先天),又與經驗有關,這是康德哲學的一個重要概念。康德在必定程度上調和了經驗主義和理性主義,其處理方法中最重要的一個就是」先驗「的概念。
先於經驗的」先驗「,是做爲經驗的裁決者,做爲知識的知識出現的,由於它考察的是」知識如何可能「。有了先驗來考察知識如何可能,直觀就能夠對外物進行擇別。
知識是離不開經驗的,離不開外物的,這認可了經驗主義的觀點,另外一方面,主觀卻要用先驗去裁決,去做爲知識結構之網、知識結構只固有框架。post

筆者思考:從某種程度上講,筆者認爲先驗思想也調和了頻率統計推斷和貝葉斯統計推斷之間的鴻溝,讓基於數據驅動的機器學習和基於統計進行推斷的貝葉斯學習之間不在界限分明。先驗是一個偉大的理論創新

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 stats


x = 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 stats


psi = 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 stats


colors = ["#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.html

0x2:泊松分佈 - n趨向無窮時的離散二項分佈

Poisson分佈,是一種離散機率分佈,由法國數學家西莫恩·德尼·泊松(Siméon-Denis Poisson)在1838年時發表。

1. 數學公式

注意:泊松分佈的公式和二項分佈的公式是相同的,區別在於泊松分佈在n趨向於無窮時,公式能夠近似等於另外一個計算等式

泊松分佈的參數λ是單位時間(或單位面積)內隨機事件的平均發生次數。

泊松分佈的指望和方差均爲。特徵函數爲 

上圖中能夠很清楚看到,λ(樣本均值) 這個參數是如何影響泊松分佈函數的形狀的。

2. 公式的原理推導和理解

公司樓下有家饅頭店,天天早上六點到十點營業,生意挺好,就是發愁一個事情,應該準備多少個饅頭才能既不浪費又能充分供應?

老闆決定採用數據驅動的方式解決這個問題,先採集數據!老師統計了一週每日賣出的饅頭:

均值爲:

\overline{X}=\frac{3+7+4+6+5}{5}=5\\

按道理講均值是不錯的選擇(基於最小二乘的損失函數),可是若是天天準備5個饅頭的話,從統計表來看,至少有兩天不夠賣,40\% 的時間不夠賣:

那怎麼辦呢?很顯然,咱們不能按照MAX值來準備,那麼確實保險程度最高,可是浪費糧食的機率也很高。很顯然,這裏須要基於機率推斷的思想,選擇一個有較高几率(95%)饅頭恰好夠供給的數字,問題是這個數字怎麼算出來呢?

老闆的解決策略是:用機率統計的方式解決問題,首先先將問題轉化爲二項實驗問題,在二項分佈的框架內進行思考和計算

老闆嘗試把營業時間抽象爲一根線段,把這段時間用 T 來表示:

而後把週一的三個饅頭按照銷售時間放在線段上:

把 T 均分爲四個時間段:

此時,在每個時間段上,要不賣出了(一個)饅頭,要不沒有賣出:

能夠看到在每一個時間段,就有點像拋硬幣,要不是正面(賣出),要不是反面(沒有賣出)。此時,咱們已經將某一天賣出多少饅頭的問題,轉換爲了二項分佈問題,咱們來逐條回顧下二項分佈的達成條件:

1. 每次試驗是獨立的:T內的每一個時間段是否賣出饅頭都是條件獨立的;
2. 每一個試驗只有兩個可能結果:賣出 or 不賣出;
3. 每一個試驗裏的 "成功" 機率是不變的:咱們假定顧客購買這個行爲是固定機率的;

這樣,T 內賣出3個饅頭的機率,就和拋了4次硬幣(4個時間段),其中3次正面(賣出3個)的機率同樣了。

這樣的機率經過二項分佈來計算就是:

\binom{4}{3}p^3(1-p)^1\\

老闆繼續思考,可是,當他把週二的七個饅頭放在線段上,分紅四段就不夠了:

從圖中看,每一個時間段,有賣出3個的,有賣出2個的,有賣出1個的,就再也不是單純的「賣出、沒賣出」了。二項分佈的結果惟一性條件不知足了,不能套用二項分佈了。

解決這個問題也很簡單,把 T 分爲20個時間段,那麼每一個時間段就又變爲了拋硬幣:

這樣,T 內賣出7個饅頭的機率就是(至關於拋了20次硬幣,出現7次正面):

\binom{20}{7}p^7(1-p)^{13}\\

老闆繼續思考,爲了能一次性保證在一個時間段內只會發生「賣出、沒賣出」,乾脆把時間切成 n 份,並且分得越細越好,用極限來表示:

接下來的是問題,在單個時間格內的機率p是多少?也即每次實驗中顧客是否購買饅頭的機率是多少?

在上面的假設下,問題已經被轉爲了二項分佈。二項分佈的指望爲:

E(X)=np=\mu\\

那麼:

p=\frac{\mu}{n}\\

那麼 μ 怎麼計算獲得呢?

一個簡單的回答是,能夠用歷史樣本均值(指望)計算獲得:

\overline{X}=5\\

能夠用它來近似:

\overline{X}\approx\mu\\

筆者插入:上面這樣計算的假設前提是,咱們能夠基於歷史數據來得出一個機率值,可是這裏其實隱含了一個問題,只有在歷史數據知足大數定理的時候(N很大,歷史統計數據足夠多)這個公式結果纔是無偏的,不然這個計算結果多是一個有偏結果,這個問題不影響咱們理解概念,可是讀者朋友在實際項目中要注意。大數定理!大數定理!大數定理!

有了 p=\frac{\mu}{n}了以後,咱們繼續推導上面的二項分佈公式,看看如何從二項公式演進到泊松分佈公式:

\lim_{n\to\infty}\binom{n}{k}p^k(1-p)^{n-k}=\lim_{n\to\infty}\binom{n}{k}\left(\frac{\mu}{n}\right)^k(1-\frac{\mu}{n})^{n-k}\\

咱們來算一下這個極限:

\begin{align}\lim_{n\to\infty}\binom{n}{k}\left(\frac{\mu}{n}\right)^k(1-\frac{\mu}{n})^{n-k}&= \lim_{n\to\infty}\frac{n(n-1)(n-2)\cdots(n-k+1)}{k!}\frac{\mu^k}{n^k}\left(1-\frac{\mu}{n}\right)^{n-k}\\ &=\lim_{n\to\infty}\frac{\mu^k}{k!}\frac{n}{n}\cdot\frac{n-1}{n}\cdots\frac{n-k+1}{n}\left(1-\frac{\mu}{n}\right)^{-k}\left(1-\frac{\mu}{n}\right)^n\end{align}\\

其中:

\lim_{n\to\infty}\frac{n}{n}\cdot\frac{n-1}{n}\cdots\frac{n-k+1}{n}\left(1-\frac{\mu}{n}\right)^{-k}=1\\

 

\lim_{n \to \infty}\left(1-\frac{\mu}{n}\right)^n = e^{-\mu}\\

因此:

\lim_{n\to\infty}\binom{n}{k}\left(\frac{\mu}{n}\right)^k(1-\frac{\mu}{n})^{n-k}=\frac{\mu^k}{k!}e^{-\mu}\\

上面就是泊松分佈的機率密度函數,也就是說,在 T 時間內賣出 k 個饅頭的機率爲:

P(X=k)=\frac{\mu^k}{k!}e^{-\mu}\\

通常來講,咱們會換一個符號,讓 \mu=\lambda ,因此:

P(X=k)=\frac{\lambda^k}{k!}e^{-\lambda}\\

這就是教科書中的泊松分佈的機率密度函數,公式中λ是一個形狀參數,也等於均值和方差,能夠這麼理解,先驗樣本中的均值和方差,決定對應泊松分佈的形狀。

帶入以前計算獲得的 λ = 5,獲得泊松分佈公式:

P(X=k)=\frac{5^k}{k!}e^{-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/81114920 

0x3:正態分佈 - 連續機率密度分佈

正態分佈(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=aladdin

0x4: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 stats

figsize(12.5, 5)
gamma = stats.gamma

parameters = [(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/60541847

0x5:威沙特分佈

除了標量的隨機變量以外,隨機變量還能夠是矩陣形式的!具體地說,威沙特分佈是全部半正定矩陣的分佈。

合適的協方差矩陣是正定的,所以該威沙特分佈是一個協方差矩陣的適當的先驗,咱們在下圖中,繪製一個來自 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 stats

figsize(12.5, 5)

n = 4
for i in range(10):
    ax = plt.subplot(2, 5, i + 1)
    if i >= 5:
        n = 15
    plt.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 stats

figsize(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.html

0x7:共軛先驗

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/8de4fd24e53c 

0x8:各個分佈之間的推演和轉化關係:

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,咱們對比了二項分佈和泊松分佈的頻數分佈

經過幾率分佈圖能夠看出這個近似,當二項分佈的 p 很小的時候,二者比較接近

也能夠從另外一個方面理解,當 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 pm

figsize(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 pm

figsize(12.5, 15)

p = 0.6
beta1_params = np.array([1.,1.])
beta2_params = np.array([2,10])
beta = stats.beta

x = 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 pm

rand = np.random.rand


class 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 pulling
                   the ith bandit.
    """

    def __init__(self, p_array):
        self.p = p_array
        self.optimal = np.argmax(p_array)

    def pull(self, i):
        # i is which arm to pull
        return np.random.rand() < self.p[i]

    def __len__(self):
        return len(self.p)


class BayesianStrategy(object):
    """
    Implements a online, learning strategy to solve
    the Multi-Armed Bandit problem.

    parameters:
        bandits: a Bandit class with .pull method

    methods:
        sample_bandits(n): sample and train on n pulls.

    attributes:
        N: the cumulative number of samples
        choices: the historical choices as a (N,) array
        bb_score: the historical score as a (N,) array
    """

    def __init__(self, bandits):
        self.bandits = bandits
        n_bandits = len(self.bandits)
        self.wins = np.zeros(n_bandits)
        self.trials = np.zeros(n_bandits)
        self.N = 0
        self.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 sample
            choice = np.argmax(np.random.beta(1 + self.wins, 1 + self.trials - self.wins))

            # sample the chosen bandit
            result = self.bandits.pull(choice)

            # update priors and score
            self.wins[choice] += result
            self.trials[choice] += 1
            bb_score[k] = result
            self.N += 1
            choices[k] = choice

        self.bb_score = np.r_[self.bb_score, bb_score]
        self.choices = np.r_[self.choices, choices]
        return


figsize(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 function
    wins = bayesian_strategy.wins
    trials = bayesian_strategy.trials
    for 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)
    return

hidden_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 pm

rand = np.random.rand

figsize(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 pm

rand = np.random.rand

figsize(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] += _regret
    plt.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. 層次算法

咱們能夠在較小的遊戲機算法之上再創建一個貝葉斯遊戲機算法。即再創建一個貝葉斯遊戲機模型,用於選擇選擇哪一個子模型。原理上相似決策樹和隨機森林的概念。 

相關文章
相關標籤/搜索