索鸟网

  1. 首页
  2. 什么叫做CRP(Chinese Restaurant Process),中国餐馆过程在hlda中的使用

什么叫做CRP(Chinese Restaurant Process),中国餐馆过程在hlda中的使用


Author : Jasperyang
School : BUPT

写在前面

是这样的,我在看Blei大牛03年的hlda论文中提到了CRP,觉得这是个很有意思的数学现象,并且深入了解后便于后面的研究,便通过查找不同资料加以理解。

正文

中国餐馆过程是一个典型的Dirichlet过程混合模型。可以将中国餐馆过程描述如下:

假设一个中国餐馆中,可以有无限个桌子,来吃饭的第一位顾客坐了第一张桌子。

对于每一位顾客,都按照下面的规则来选择桌子坐下,对于第n个顾客:

$$ \frac{n_{k}}{a_{0}+n-1}$$

其中,nk 表示第k个桌子上已经有的顾客数。n−1表示在这个顾客之前,已有的顾客总数。 a0就是个参数(需设置)。

顾客可以选择坐在一个没有人坐的桌子上K+1的概率为

$$ \frac{a_{0}}{a_{0}+n-1}$$

在这里,可以将顾客类比成数据,将每一张桌子类别成类。

这么讲不具体,下面贴个R语言的代码详细说。



# 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就是a0,会发现,a0越大,最后分出来的桌子可能会越多。

以上这么讲是 Hierarchical Topic Models and the Nested Chinese Restaurant Process 这篇论文的原意。

这个位置选择方式也就是公式的合理性是在别的文章中讲解的。

首先需要介绍一下狄利克雷过程。

Dirichlet Process (DP)被称为分布的分布。从DP抽取出的每个样本(一个函数)都可以被认为是一个离散随机变量的分布函数,这个随机变量以非零概率值在可数无穷个离散点上取值。比较有意思的是,从DP可以推导出几个非常著名的问题: Chinese Restaurant Process (CRP)、Polya Urn Scheme和Stick-breaking Process。简单的介绍可以见Edwin Chen的博文“Infinite Mixture Models with Nonparametric Bayes and the Dirichlet Process”,这篇详解了包括dp,crp等好几个过程,但是没有讲数学推导。

DP的特性使得它在非参数贝叶斯聚类模型中可以被用作参数的先验分布。Dirichlet Process Mixture (DPM)是这种非参数贝叶斯聚类模型中的一个典型代表。DPM可以认为是有限混合(Finite Mixture,FM)模型的一个推广,FM(如Gaussian Mixture模型)必须首先给定类数,而DPM则不需要,它可以依据数据自行判断类数。理论上来说,DPM的类数随着log(样本点数量)的增长速度增长。目前研究者已经提出了很多训练DPM的算法,从Gibbs Sampling,到Collapsed Gibbs Sampling,到Variational方法。

想进一步了解DP和DPM的同学,可以去Yee W. Teh的主页上看看,里面可以找到很多相关的papers,slides,presentations,以及用Matlab写的DPM开源软件。想仔细了解DPM的各个算法及具体推导,建议看看Xiaodong Yu的博文,里面也有他总结的一个很详细的学习笔记(虽然里面有一些小笔误),以及更多的参考资料。

在hlda中将这个crp推广到多层级的topic其实很简单,就是先找一家餐馆也就是一个root_topic,然后在这家餐馆里的每个桌子上放的是别的餐馆的名字,一次类推,就可以无限的延续下去。

最后

这篇主要就是讲 Chinese Restaurant Process ,后续的文章我可能会去详解HLDA。

r 论文

来源地址:https://segmentfault.com/a/1190000010694630 版权归作者所有!