1. 程式人生 > >取樣方法(二)MCMC相關演算法介紹及程式碼實現

取樣方法(二)MCMC相關演算法介紹及程式碼實現

0.引子

書接前文,在取樣方法(一)中我們講到了拒絕取樣、重要性取樣一系列的蒙特卡洛取樣方法,但這些方法在高維空間時都會遇到一些問題,因為很難找到非常合適的可採樣Q分佈,同時保證取樣效率以及精準度
本文將會介紹取樣方法中最重要的一族演算法,MCMC(Markov Chain Monte Carlo),在之前我們的蒙特卡洛模擬都是按照如下公式進行的:

E[f(x)]1mi=1mf(xi).xip.iid
我們的x都是獨立取樣出來的,而在MCMC中,它變成了
E[f(x)]1mi=1mf(xi).(x0,x1,...,xm)MC(p)
其中的MC(p)就是我們本文的主角之一,馬爾可夫過程
(Markov Process)生成的馬爾可夫鏈(Markov Chain)。

1.Markov Chain(馬爾可夫鏈)

序列的演算法(一·a)馬爾可夫模型中我們就說到了馬爾可夫模型的馬爾可夫鏈,簡單來說就是滿足馬爾可夫假設

P(sn|s0,s1,...,sn1)=P(sn|sn1)
的狀態序列,由馬爾可夫過程(Markov Process)生成。
一個馬爾可夫過程由兩部分組成,一是狀態集合Ω,二是轉移概率矩陣T
其流程是:選擇一個初始的狀態分佈π0,然後進行狀態的轉移:
πn=πn1T
得到的π0,π1,π2...πn狀態分佈序列。

注意:我們在這裡講的理論和推導都是基於離散變數的,但其實是可以直接推廣到連續變數

馬爾可夫鏈在很多場景都有應用,比如大名鼎鼎的pagerank演算法,都用到了類似的轉移過程;
馬爾可夫鏈在某種特定情況下,有一個奇妙的性質:

在某種條件下,當你從一個分佈π0開始進行概率轉移,無論你一開始π0的選擇是什麼,最終會收斂到一個固定的分佈π,叫做穩態(steady-state)。
穩態滿足條件:

π=πT
這裡可以參考《LDA數學八卦0.4.2》的例子,非常生動地描述了社會階層轉化的一個例子,也對MCMC作了非常好的講解

書歸正傳,回到我們取樣的場景,我們知道,取樣的難點就在於概率密度函式過於複雜而無法進行有效取樣,如果我們可以設計一個馬爾可夫過程,使得它最終收斂的分佈是我們想要取樣的概率分佈,不就可以解決我們的問題了麼。

前面提到了在某種特定情況下,這就是所有MCMC演算法的理論基礎Ergodic Theorem
如果一個離散馬爾可夫鏈(x0,x1...xm)是一個與時間無關的Irreducible的離散,並且有一個穩態分佈π,則:

E[f(x)]1mi=1mf(xi).xπ
它需要滿足的條件有這樣幾個,我們直接列在這裡,不作證明:

1.Time homogeneous: 狀態轉移與時間無關,這個很好理解。
2.Stationary Distribution: 最終是會收斂到穩定狀態的。
3.Irreducible: 任意兩個狀態之間都是可以互相到達的。
4.Aperiodic:馬爾可夫序列是非週期的,我們所見的絕大多數序列都是非週期的。

雖然這裡要求是離散的馬爾可夫鏈,但實際上對於連續的場景也是適用的,只是轉移概率矩陣變成了轉移概率函式。

2.MCMC

在上面馬爾可夫鏈中我們的所說的狀態都是某個可選的變數值,比如社會等級上、中、下,而在取樣的場景中,特別是多元概率分佈,並不是量從某個維度轉移到另一個維度,比如一個二元分佈,二維平面上的每一個點都是一個狀態,所有狀態的概率和為1! 這裡比較容易產生混淆,一定小心。

在這裡我們再介紹一個概念:
Detail balance: 一個馬爾可夫過程是細緻平穩的,即對任意a,b兩個狀態:

π(a)Tab=π(b)Tba細緻平穩條件也可以推匯出一個非週期的馬爾可夫鏈是平穩的,因為每次轉移狀態i從狀態j獲得的與j從i獲得的是一樣的,那毫無疑問最後πT=π.

所以我們的目標就是需要構造這樣一個馬爾可夫鏈,使得它最後能夠收斂到我們期望的分佈π,而我們的狀態集合其實是固定的,所以最終目標就是構造一個合適的T,就大功告成了。

一般來說我們有:

π(x)=π̃ (x)Z
其中Z是歸一化引數Z=Σxπ̃ (x),因為我們通常能夠很方便地計算分子π̃ (x),但是分母的計算因為要列舉所有的狀態所以過於複雜而無法計算。我們希望最終取樣出來的樣本符合π分佈。

2.1.Metropolis

2.1.1原理描述

Metropolis演算法算是MCMC的開山鼻祖了,它這裡假設我們已經有了一個狀態轉移概率函式T來表示轉移概率,T(a,b)表示從a轉移到b的概率(這裡T的選擇我們稍後再說),顯然通常情況下一個T是不滿足細緻平穩條件的:

π(a)T(a,b)π(b)T(b,a)
所以我們需要進行一些改造,加入一項Q使得等式成立:
π(a)T(a,b)Q(a,b)=π(b)T(b,a)Q(b,a)
基於對稱的原則,我們直接讓
Q(a,b)=π(

相關推薦

取樣方法MCMC相關演算法介紹程式碼實現

0.引子 書接前文,在取樣方法(一)中我們講到了拒絕取樣、重要性取樣一系列的蒙特卡洛取樣方法,但這些方法在高維空間時都會遇到一些問題,因為很難找到非常合適的可採樣Q分佈,同時保證取樣效率以及精準度。 本文將會介紹取樣方法中最重要的一族演算法,MCMC(Mar

【百度】大型網站的HTTPS實踐——HTTPS加密演算法介紹

大型網站的HTTPS實踐(二)——HTTPS加密演算法介紹 原創 網路通訊/物聯網 作者:AIOps智慧運維 時間:2018-11-09 15:09:43  358  0   前言

k-means演算法原理以及python實現

一、有監督學習和無監督學習 1. 有監督學習 監督學習(supervised learning):通過已有的訓練樣本(即已知資料以及其對應的輸出)來訓練,從而得到一個最優模型,再利用這個模型將所有新的資料樣本對映為相應的輸出結果,對輸出結果進行簡單的判斷從而

篩素數方法—— 費馬小定理MR素數判斷

註明:本文中的x^y表示x的y次方 一、費馬小定理 1.1 內容 若p為素數,a為正整數,且gcd(a,p)=1,則a^(p−1)≡1(mod p)。1.2 證明 因為p為素數,所以gcd(

最近最久未使用LRU頁面置換演算法原理模擬實現

FIFO演算法的效能較差,它所依據的條件是各個頁面調入記憶體的時間,而頁面調入的先後並不能反映頁面的使用狀況。最近最久未使用(LRU)的頁面置換演算法是根據頁面調入記憶體後的使用情況做出決策的。由於無法預測各頁面將來的使用情況,只能利用“最近的過去”作為“最近的

spring原始碼剖析Spring預設標籤解析註冊實現

在使用spring的時候,我也經常會使用到bean標籤,beans標籤,import標籤,aop標籤等。 下面主要為讀者介紹spring的預設的自帶標籤的解析流程。 驗證模式(DTD&XSD) dtd基本已被淘汰,現在spring的驗證模式基本都是採用xsd檔案

劃分方法聚類K-MEANS演算法的改進

   本文將主要針對K-MEANS演算法主要缺點的改進進行講述。 (1)離群點,噪聲點的改進:針對離群點、噪聲點,通過離群點檢測演算法,去掉離群點與噪聲點。資料探勘方面,經常需要在做特徵工程和模型訓

python中關於操作時間的方法:使用datetime模塊

log time模塊 bsp lib .py nth mon target ear 使用datetime模塊來獲取當前的日期和時間 1 import datetime 2 i=datetime.datetime.now() 3 print ("當前的日期和時間是%

關於Android滑動沖突的解決方法

頂部 ole onscroll googl mea tracking see doc 特性 之前的一遍學習筆記主要就Android滑動沖突中,在不同方向的滑動所造成沖突進行了了解,這樣的沖突非常easy理解,當然也非常easy解決。今天,就同方向的滑動所

JavaScript 字符串方法

cal sat pos scrip 一個 tle 字符位置 分割 text 字符串大小寫轉換方法<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"&

Jmeter腳本錄制方法——手工編寫腳本jmeter與fiddler結合使用

腳本 pic ddl 錄制 com spa hub .com 使用 http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1634097http://pic.cnhubei.com/space.php?u

測試人員必學的軟件快速測試方法

軟件測試 快速測試 專項測試 自動化測試 缺陷管理 以下是測試專家Cem Kaner在黑盒軟件測試中總結的一些快速測試方法,這裏進行補充和調整,並同步更新到我們的測試知識共享庫中,使用時可靈活增刪改查。1.用戶界面 若軟件在應用商店中銷售,界面很可能成為用戶是否安裝或購買的重要因素 1).

面向對象進階——內置方法

解釋器 ddr _for 定義 解釋 spl 分享圖片 color ack 七、__setitem__, __getitem__, __delitem__   item系列 class Foo: def __init__(self, name):

排序方法

import __name__ () def col == doctest AS all 插入法排序還可以用python的切片功能和遞歸的思路來實現 ‘‘‘ From smallest to largest ‘‘‘ def insert_sorted(list_of_nb

電平轉換方法

左右 基本 計算周 電平 電容 連接 set 正常 存在   單向電平轉換芯片SN74AVC2T244的使用與驗證。   實際驗證TDO可正常升壓使用,波形正常。TDI,TMS可正常降壓使用,波形正常。   TRST,RST均可降壓使用,波形正常。   然而還是無法連接JT

真正掌握vuex的使用方法現在有的小夥伴是不是在想,以後如果我要在這裏寫自己的計算屬性怎麽辦?怎麽辦?咱們可以通過對象合並的方法實現。 通過Object.assign()合並對象:

als js文件 false 目錄 pan md5加密 擴展 對象 pre 從上篇文章當中相信大家已經對vuex有了一些大概了解了,接下來咱們結合實例來繼續敲代碼吧!切記一定要動手實操練習一遍! 接下來咱們來完成一個超級簡單的投票功能!要求很簡單,點擊“投票”按鈕,相應的票

css垂直居中幾種方法

play spa light dex bsp png ava ems pre 方法1:table-cell .box1{ display: table-cell; vertical-align: middle; text-a

java後臺面試題整理解答JVM相關

ise 可用 檢測 tom 載器 發的 weakref 字節 tomcat 類的實例化順序,比如父類靜態數據,構造函數,字段,子類靜態數據, 先靜態、先父後子。 先靜態:父靜態 > 子靜態 優先級:父類 > 子類 靜態代碼塊 > 非靜態代碼塊 >

spring-boot-2.0.3不一樣系列之源碼篇 - run方法之prepareEnvir

config ace let fff 輸出 cloud 通過 什麽事 來看 前言  此系列是針對springboot的啟動,旨在於和大家一起來看看springboot啟動的過程中到底做了一些什麽事。如果大家對springboot的源碼有所研究,可以挑些自己感興趣或者對自己有

JDBC資料庫連線池連線資料庫資料庫操作DAO層設計通用更新查詢方法

上篇文章主要介紹了通過資料庫連線池連線資料庫,然後設計了對資料庫通用更新和查詢方法,本篇文章主要通過例項介紹上篇文章定義的對資料庫操作的幾個方法的使用:     首先我們先在資料庫建立一個學生資訊表Student欄位如圖: 建立好表將配置檔案的資訊改好然後需要建立一