狄利克萊過程模型(二):狄利克萊過程分佈的三個經典類比
首先是折棍子模型:
將觀測資料分配到不同群中的生成模型,就是一個折棍子的過程,它將一個變數的支援度(所謂支援度,採用了資料探勘中關聯規則抽取的術語了,意思就是概率,搞不明白為毛用支援度這個術語)分為相互不重疊的k個部分,首先,我們從一個長度為單位1的棍子開始,開始折這個棍子,我們根據下面演算法在棍子上生成隨機點:
(1)從分佈beta1~Beta(1,alpha0)的分佈中產生一個隨機變數
(2)使用這個隨機變數來指出棍子上的折斷點
(3)迭代k-1次,
生成隨機變數 betai~Beta(1,alpha0)
確定下一個代表折斷點的隨機變數I,這個折斷點在上一次折斷後剩下的一段棍子上,I的公式是:
在這個類比中,最終截成了k個木棍,每根木棍的長度就代表一個概率值,k個概率值就是一個dirichlet分佈,所以DPP是一個分佈之上的分佈,不過值得注意的是,在折棍子最終產生多個棍子截的過程中,是有順序的,不過最終得到的這個概率分佈,也就是"分佈上的分佈"中的第一個分佈,是沒有順序的。另外,k可能是無限的,最終的棍子數量也是無限的。
下面是折棍子的python程式碼實現:
from numpy.random import beta def stick_breaking(alpha, k): betas = beta(1, alpha, k) remaining_pieces = np.append(1, np.cumprod(1 - betas[:-1])) p = betas * remaining_pieces return p/p.sum()
中國餐館模型:
讓我們假設你的朋友昨天去了一家中國餐館:
(1) 餐館為空
(2) 第一個人alice進入,挑了一個桌子旁邊坐下,開始點飯(為這個組選擇引數),其他選擇alice桌子的人,必須吃alice點的飯
(3) bob第二個進來,他有alpha/(1+alpha)的概率坐在一個新桌子邊並進行點餐,有1/(1+alpha)的概率坐在alice桌子邊
。。。。。。。
(n) 第n+1個人進來,他有alpha/(n+alpha)的概率坐在一張新桌子上並點餐,有nk/(n+alpha)的概率坐在已經有nk個人的k桌邊
請注意一些現象:
a.一個桌子的人越多,人們就越是可能坐到這個桌子旁,換句話說,聚類符合馬太效應
b.永遠都有一種可能性,一個人開一張新桌子
c.能否開一張新桌子,得看alpha,我們把它叫做分散引數,它影響我們資料的分散程度,alpha越低,我們資料聚類越少,越緊湊,alpha越大,資料越分散,得到的聚簇越多
下面是中國餐館過程的ruby程式碼
# Generate table assignments for `num_customers` customers, according to
# a Chinese Restaurant Process with dispersion parameter `alpha`.
#
# returns an array of integer table assignments
def chinese_restaurant_process(num_customers, alpha)
return [] if num_customers <= 0
table_assignments = [1] # first customer sits at table 1
next_open_table = 2 # index of the next empty table
# Now generate table assignments for the rest of the customers.
1.upto(num_customers - 1) do |i|
if rand < alpha.to_f / (alpha + i)
# Customer sits at new table.
table_assignments << next_open_table
next_open_table += 1
else
# Customer sits at an existing table.
# He chooses which table to sit at by giving equal weight to each
# customer already sitting at a table.
which_table = table_assignments[rand(table_assignments.size)]
table_assignments << which_table
end
end
table_assignments
end
應用這些程式碼
chinese_restaurant_process(num_customers = 10, alpha = 1)
1, 2, 3, 4, 3, 3, 2, 1, 4, 3 # table assignments from run 1
1, 1, 1, 1, 1, 1, 2, 2, 1, 3 # table assignments from run 2
1, 2, 2, 1, 3, 3, 2, 1, 3, 4 # table assignments from run 3
> chinese_restaurant_process(num_customers = 10, alpha = 3)
1, 2, 1, 1, 3, 1, 2, 3, 4, 5
1, 2, 3, 3, 4, 3, 4, 4, 5, 5
1, 1, 2, 3, 1, 4, 4, 3, 1, 1
> chinese_restaurant_process(num_customers = 10, alpha = 5)
1, 2, 1, 3, 4, 5, 6, 7, 1, 8
1, 2, 3, 3, 4, 5, 6, 5, 6, 7
1, 2, 3, 4, 5, 6, 2, 7, 2, 1
隨著alpha的增大,桌子數量增多。
polya Urn MODEL 波利亞罐子模型
罐子中包含顏色為x的球alphaGo(x)個,其中Go是我們的基本分佈,Go(x)是從Go中抽取x的概率
在每個時間點,從罐子中抽取一個球,記住它的顏色,然後將原來的球與一樣顏色的新球放回到罐子中。
DPP模型可以用於聚類,其好處在於不用專門指定一個聚類的數量,關於這個有人寫過一些DPP聚類的程式碼,並提供了一個很toy的例子,見下面地址:
http://www.ece.sunysb.edu/~zyweng/dpcluster.html