1. 程式人生 > >狄利克萊過程模型(二):狄利克萊過程分佈的三個經典類比

狄利克萊過程模型(二):狄利克萊過程分佈的三個經典類比

       關於DPP的三個經典類比,在本文中依次進行說明:

       首先是折棍子模型:

       將觀測資料分配到不同群中的生成模型,就是一個折棍子的過程,它將一個變數的支援度(所謂支援度,採用了資料探勘中關聯規則抽取的術語了,意思就是概率,搞不明白為毛用支援度這個術語)分為相互不重疊的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