MC, MCMC, Gibbs取樣 原理&實現(in R)
本文用講一下指定分佈的隨機抽樣方法:MC(Monte Carlo), MC(Markov Chain), MCMC(Markov Chain Monte Carlo)的基本原理,並用R語言實現了幾個例子:
1. Markov Chain (馬爾科夫鏈)
2. Random Walk(隨機遊走)
3. MCMC具體方法:
3.1 M-H法
3.2 Gibbs取樣
PS:本篇blog為ese機器學習短期班參考資料(20140516課程),課上講詳述。
下面三節分別就前面幾點簡要介紹基本概念,並附上程式碼。這裡的概念我會用最最naive的話去概括,詳細內容就看我最下方推薦的連結吧(*^__^*)
0. MC(Monte Carlo)
生成指定分佈的隨機數的抽樣。
1. Markov Chain (馬爾科夫鏈)
假設 f(t) 是一個時間序列,Markov Chain是假設f(t+1)只與f(t)有關的隨機過程。
Implement in R:
#author: rachel @ ZJU #email: [email protected] N = 10000 signal = vector(length = N) signal[1] = 0 for (i in 2:N) { # random select one offset (from [-1,1]) to signal[i-1] signal[i] = signal[i-1] + sample(c(-1,1),1) } plot( signal,type = 'l',col = 'red')
2. Random Walk(隨機遊走)
如布朗運動,只是上面Markov Chain的二維拓展版:
Implement in R:
#author: rachel @ ZJU
#email: [email protected]
N = 100
x = vector(length = N)
y = vector(length = N)
x[1] = 0
y[1] = 0
for (i in 2:N)
{
x[i] = x[i-1] + rnorm(1)
y[i] = y[i-1] + rnorm(1)
}
plot(x,y,type = 'l', col='red')
3. MCMC具體方法:
MCMC方法最早由Metropolis(1954)給出,後來Metropolis的演算法由Hastings改進,合稱為M-H演算法。M-H演算法是MCMC的基礎方法。由M-H演算法演化出了許多新的抽樣方法,包括目前在MCMC中最常用的Gibbs抽樣也可以看做M-H演算法的一個特例[2]。
概括起來,MCMC基於這樣的理論,在滿足【平衡方程】(detailed balance equation)條件下,MCMC可以通過很長的狀態轉移到達穩態。
【平衡方程】:pi(x) * P(y|x) = pi(y) * P(x|y)其中pi指分佈,P指概率。這個平衡方程也就是表示條件概率(轉化概率)與分佈乘積的均衡.3.1 M-H法
1. 構造目標分佈,初始化x0
2. 在第n步,從q(y|x_n) 生成新狀態y
3. 以一定概率((pi(y) * P(x_n|y)) / (pi(x) * P(y|x_n)))接受y <PS: 看看上面的平衡方程,這個概率表示什麼呢?參考這裡和[1]>
implementation in R:
#author: rachel @ ZJU
#email: [email protected]
N = 10000
x = vector(length = N)
x[1] = 0
# uniform variable: u
u = runif(N)
m_sd = 5
freedom = 5
for (i in 2:N)
{
y = rnorm(1,mean = x[i-1],sd = m_sd)
print(y)
#y = rt(1,df = freedom)
p_accept = dnorm(x[i-1],mean = y,sd = abs(2*y+1)) / dnorm(y, mean = x[i-1],sd = abs(2*x[i-1]+1))
#print (p_accept)
if ((u[i] <= p_accept))
{
x[i] = y
print("accept")
}
else
{
x[i] = x[i-1]
print("reject")
}
}
plot(x,type = 'l')
dev.new()
hist(x)
3.2 Gibbs取樣
第n次,Draw from ,迭代取樣結果接近真實p(\theta_1, \theta_2, ...)也就是每一次都是固定其他引數,對一個引數進行取樣。比如對於二元正態分佈,其兩個分量的一元條件分佈仍滿足正態分佈:那麼在Gibbs取樣中對其迭代取樣的過程,實現如下:
#author: rachel @ ZJU
#email: [email protected]
#define Gauss Posterior Distribution
p_ygivenx <- function(x,m1,m2,s1,s2)
{
return (rnorm(1,m2+rho*s2/s1*(x-m1),sqrt(1-rho^2)*s2 ))
}
p_xgiveny <- function(y,m1,m2,s1,s2)
{
return (rnorm(1,m1+rho*s1/s2*(y-m2),sqrt(1-rho^2)*s1 ))
}
N = 5000
K = 20 #iteration in each sampling
x_res = vector(length = N)
y_res = vector(length = N)
m1 = 10; m2 = -5; s1 = 5; s2 = 2
rho = 0.5
y = m2
for (i in 1:N)
{
for(i in 1:K)
{
x = p_xgiveny(y, m1,m2,s1,s2)
y = p_ygivenx(x, m1,m2,s1,s2)
# print(x)
x_res[i] = x;
y_res[i] = y;
}
}
hist(x_res,freq = 1)
dev.new()
plot(x_res,y_res)
library(MASS)
valid_range = seq(from = N/2, to = N, by = 1)
MVN.kdensity <- kde2d(x_res[valid_range], y_res[valid_range], h = 10) #估計核密度
plot(x_res[valid_range], y_res[valid_range], col = "blue", xlab = "x", ylab = "y")
contour(MVN.kdensity, add = TRUE)#二元正態分佈等高線圖
#real distribution
# real = mvrnorm(N,c(m1,m2),diag(c(s1,s2)))
# dev.new()
# plot(real[1:N,1],real[1:N,2])
x分佈圖:
(x,y)分佈圖:
Reference:
1. http://www2.isye.gatech.edu/~brani/isyebayes/bank/handout10.pdf
2. http://site.douban.com/182577/widget/notes/10567181/note/292072927/
3. book: http://statweb.stanford.edu/~owen/mc/
4. Classic: http://cis.temple.edu/~latecki/Courses/RobotFall07/PapersFall07/andrieu03introduction.pdf
歡迎參與討論並關注本部落格和微博Rachel____Zhang, 後續內容繼續更新哦~
相關推薦
MC, MCMC, Gibbs取樣 原理&實現(in R)
本文用講一下指定分佈的隨機抽樣方法:MC(Monte Carlo), MC(Markov Chain), MCMC(Markov Chain Monte Carlo)的基本原理,並用R語言實現了幾個例子:1. Markov Chain (馬爾科夫鏈)2. Random Wal
HashMap的底層原理實現(1)
TP CQ 鍵值對 jpeg 需要 dns cnp 第一步 進行 ———————————— 眾所周知,HashMap是一個用於存儲Key-Value鍵值對的集合,每一個鍵值對也叫做Entry。這些個鍵值對(Entry)分散存儲
【機器學習】Apriori演算法——原理及程式碼實現(Python版)
Apriopri演算法 Apriori演算法在資料探勘中應用較為廣泛,常用來挖掘屬性與結果之間的相關程度。對於這種尋找資料內部關聯關係的做法,我們稱之為:關聯分析或者關聯規則學習。而Apriori演算法就是其中非常著名的演算法之一。關聯分析,主要是通過演算法在大規模資料集中尋找頻繁項集和關聯規則。
字串匹配原理及實現(C++版)
字串匹配原理及實現(C++版) 1. 字串匹配概念 2. BF 2.1 原理 2.2 程式碼實現 3. KMP 3.1 原理 3.2 程式碼實現 4. BM 4.1 壞字元
簡單選擇排序演算法原理及java實現(超詳細)
選擇排序是一種非常簡單的排序演算法,就是在序列中依次選擇最大(或者最小)的數,並將其放到待排序的數列的起始位置。 簡單選擇排序的原理 簡單選擇排序的原理非常簡單,即在待排序的數列中尋找最大(或者最小)的一個數,與第 1 個元素進行交換,接著在剩餘的待排序的數列中繼續找最大(最小)的一個數,與第 2 個元素交
foreach遍歷實現原理_迭代器實現(使用foreach)
遍歷陣列或者集合時,之所以使用foreach可以實現,那是因為類中繼承了IEnunerable介面,此介面可以重寫IEnumerator型別的GetEnumerator()方法(此方法即得到一個列舉器),正是因為這個介面(方法)所以foreach才會起到遍歷的作用 上程式碼: namespace
順序表的插入操作原理及實現(C語言)詳解
順序表中存放資料的特點和陣列這種資料型別完全吻合,所以順序表的實現使用的是陣列。換句話說,順序表中插入元素問題也就等同於討論如何向陣列中插入資料。 因此,順序表中插入資料元素,無非三種情況: 在表頭插入; 在表的中間某個位置插入; 直接尾隨順序表,作為表的最後一個元素; 無論在順序表的什麼位置插
氣泡排序演算法原理及實現(超詳細)
氣泡排序(Bubble Sort)是排序演算法裡面比較簡單的一個排序。它重複地走訪要排序的數列,一次比較兩個資料元素,如果順序不對則進行交換,並一直重複這樣的走訪操作,直到沒有要交換的資料元素為止。 氣泡排序的原理 為了更深入地理解氣泡排序的操作步驟,我們現在看一下氣泡排序的原理。 首先我們肯定有一個數組
恩智浦杯(飛思卡爾)全國大學生智慧車競賽攝像頭簡單的影象失真矯正技術原理與實現(透視變換)
先說一些廢話(沒耐心看可直接看分割線下面的內容): 博主是去年參加了十二屆的恩智浦杯(飛思卡爾)全國大學生智慧車競賽光電競速組,我們隊當時獲得的是區賽預賽第三、決賽第四的成績,我們區賽的光電競速組可以選拔五組進入全國總決賽,但因為我們學校另一個隊獲得了區賽決賽第三,
Netty構建分散式訊息佇列實現原理淺析(十六)
在本人的上一篇部落格文章:Netty構建分散式訊息佇列(AvatarMQ)設計指南之架構篇 中,重點向大家介紹了AvatarMQ主要構成模組以及目前存在的優缺點。最後以一個生產者、消費者傳遞訊息的例子,具體演示了AvatarMQ所具備的基本訊息路由功能。而本文的寫作
Tensorflow實戰:Word2Vec_Skip_Gram原理及實現(多註釋)
Word2Vec也稱Word Embeddings,中文的叫法為“詞向量”或“詞嵌入”,是一種非常高效的,可以從原始語料中學習字詞空間向量的預測模型。 在Word2Vec出現之前,通常將字詞轉為One-Hot Encoder ,一個詞對應一個
P2P之UDP穿透NAT的原理與實現(附原始碼)
原文連結 關於UDP穿透NAT的中文資料在網路上是很少的,僅有<<P2P之UDP穿透NAT的原理與實現(shootingstars)>>這篇文章有實際的參考價值。 本人近兩年來也一直從事P2P方面的開發工作,比較有代表性的是個人開發的BitTorr
堆排序原理及演算法實現(最大堆)
堆排序 堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。 1.堆 堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>
QT in VS 多語言實現(中英文切換)
最近專案需要軟體具有中英文雙語切換功能,而QT又自帶此功能,現將實現方式記錄下來。 說到中英文切換,少不了要了解QT的內部編碼方式。在此就不詳述QT編碼方式了,具體可參考 徹底弄懂Qt的編碼。只需要記住QT採用utf-8編碼!window作業系統採用ansi編
決策樹ID3原理及R語言python程式碼實現(西瓜書)
決策樹ID3原理及R語言python程式碼實現(西瓜書) 摘要: 決策樹是機器學習中一種非常常見的分類與迴歸方法,可以認為是if-else結構的規則。分類決策樹是由節點和有向邊組成的樹形結構,節點表示特徵或者屬性, 而邊表示的是屬性值,邊指向的葉節點為對應的分類。在對樣本的分類過程中,由頂向下,根據特徵或屬性
布隆過濾器(Bloom Filters)的原理及程式碼實現(Python + Java)
本文介紹了布隆過濾器的概念及變體,這種描述非常適合程式碼模擬實現。重點在於標準布隆過濾器和計算布隆過濾器,其他的大都在此基礎上優化。文末附上了標準布隆過濾器和計算布隆過濾器的程式碼實現(Java版和Python版) 本文內容皆來自 《Foundations of Computers Systems Rese
字符串函數---atof()函數具體解釋及實現(完整版)
記錄 == include als 技術 整數 ast fill 跳過 atof()函數 atof():double atof(const char *str ); 功 能: 把字符串轉換成浮點數 str:要轉換的字符串。 返回值:每一個函數返回 double 值。此值
Linux下FTPserver的實現(仿vsftpd)
stat 通信 ip地址 啟動 思想 ipp size_t ascii 上傳 繼上一篇博文實現Linux下的shell後,我們進一步利用網絡編程和系統編程的知識實現Linux下的FTPserver。我們以vsftpd為原型並實現了其大部分的功能。因為篇幅和時間的關系
自己主動升級系統的設計與實現(續2) -- 添加斷點續傳功能 (附最新源代碼)
blog down 決定 top lin dom itl com 關於 一.緣起 之前已經寫了兩篇關於自己主動升級系統OAUS的設計與實現的文章(第一篇、第二篇)。在為OAUS服務端添加自己主動檢測文件變更的功能(這樣每次部署版本號升級時,能夠節省非常多時間。
從頭認識Spring-3.8 簡單的AOP日誌實現(註解版)-擴展添加檢查訂單功能,以便記錄並檢測輸入的參數
this proxy snippet 輸入 name util java framework -i 這一章節我們討論一下擴展添加檢查訂單功能,以便記錄並檢測輸入的參數。1.domain蛋糕類:package com.raylee.my_new_spring.my_new