2014年11月18日 星期二

[貝氏] 煩死人的 Variational Bayes 初探

先說,搞懂這個東西的過程令人崩潰的程度大概是這樣

羽生結弦,日本天才花式滑冰選手
圖片來源http://abcnews.go.com/Sports/photos/tough-straight-face-midair-22463006/image-22525718

貝氏統計推論中,有些Posterior實在太複雜太難算,用sampling (如MCMC)抽一大堆貌似合理的樣本來進行參數推論是經常使用的替代方式。然而sampling也有既存的問題,比如說常常讓運算速度不夠快,或是完全來自隨機以致收斂性等表現難以掌握等等。總之,學界開始尋找其他逼近(approximation)的方法在某些場合下取代MCMC。

Variational Bayes算是最紅的,許多貝氏建模的文章都會提供相對應的演算細節。

大致上的概念是這樣的,我們感興趣的東西是p(θ|x),並且

p(θ|x)p(θ)p(x|θ)

找一個替代品q(θ),並且讓這個替代品和posterior很像很像,換句話說就是努力把

KL[q(θ),p(θ|x)]

變得很小很小(沒錯,Kullback-leibler divergence這個小壞壞又出現了)

然後,因為我們有好多個parameter要推論,mean field assumption會是一個把情況變得簡單的假設,也就是所有的參數都是獨立的。也就是

q(θ)=iq(θi)

把這個該變小的Kullback-leibler divergence寫開

KL[q(θ),p(θ|x)]=q(θ)logq(θ)p(θ|x)dθ

=q(θ)logq(θ)p(x)p(θ,x)dθ

=q(θ)logq(θ)p(θ,x)dθq(θ)logp(x)dθ

=q(θ)logq(θ)p(θ,x)dθlogp(x)

由於對logp(x)已經使不上力(和θ無關),所以接下來專心解決q(θ)logq(θ)p(θ,x)dθ,並解我們知道q(θ)logq(θ)p(θ,x)dθKL[q(θ),p(θ|x)]成正比,所以要盡量把他變小

接下來引入mean field assumption

q(θ)logq(θ)p(θ,x)dθ=iq(θi)logiq(θi)p(θ,x)dθ

=iq(θi)(ilogq(θi)logp(θ,x))

=q(θj)ijq(θi)(ilogq(θi)logp(θ,x))dθ

=q(θj)ijq(θi)(logq(θj)logp(θ,x))dθ q(θj)ijq(θi)(ijlogq(θi))dθ

=q(θj)(logq(θj)ijq(θi)logp(θ,x)dθij)dθj+c

=q(θj)(logq(θj)Eq(θij)[log(θ,x))])dθj+c

=q(θj)loglogq(θj)exp(Eq(θij)[log(θ,x))])dθj+c

=KL[q(θj),exp(Eq(θij)[log(θ,x))])]+c


KL[q(θj),exp(Eq(θij)[log(θ,x))])]最小就是讓q(θ)logq(θ)p(θ,x)dθ最小,也就是讓KL[q(θ),p(θ|x)]最小,目標就完成啦!!!!!!! 哈哈哈哈~~~~~(已瘋)

而可以把KL[q(θj),exp(Eq(θij)[log(θ,x))])]變得最小的q(θj)不就是exp(Eq(θij)[log(θ,x))])本人嗎?

真是可喜可賀!!!



因此Variational Bayes演算法就大功告成了

q(θj)=1Zexp(Eq(θij)[log(θ,x))])

或者寫成

logq=Eq(θij)[log(θ,x))]logZ
逐個迭代q(θj)直到收斂為止

2014年11月2日 星期日

[SAS] 賽仕冷知識(1) missing value 也有大小之分!?

其實平常不太用SAS這個我認為會越寫越笨的東西

題外話,他們倆是關係企業嗎?
但是今天不小心發現了一個它的小秘密!!就是missing value不只一種,然後不同種之間還有大小之分太精細了RRRRRRRRRR~~~

一般來說在SAS裡missing value是用「.」表示,排序上會比有的數字小,所以如果執行 proc sort 程序後,missing value都會在最上面。

除了一般的missing value之外,還有其他種類的missing value。像是「.A」~「.Z」,或是「._」這類特殊的missing value。

根據 SAS的文件,在排序上 「._」是最小的,其次是一般的missing value「.」,再來是「.A」~「.Z」。當然,數字永遠比missing value大。

最後來驗證一下

首先製造一筆資料
data aa; 
input name $ score; 
cards; 
A 60 
B 67 
C . 
D ._ 
E .A 
F .Z
G -10
;

排序一下
proc sort data=aa; 
by score; 
run;

然後來看結果
proc print data = aa;
run;


參考資料
http://support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default/viewer.htm#a000989180.htm#a001221306