最近学习node2vec接触到了这个算法,在此简单记录下,详细可见该博客https://blog.csdn.net/haolexiao/article/details/65157026
我这里直接以上述博客的例子结合代码简单整理下
假如有四个事件,概率分别是1/2,1/3,1/12,1/12(和为 1)。
构建Alias Table
- 将四个事件排成一列,分为1,2,3,4。
- 每个概率乘以四(事件数)。
- 然后拼凑使每列值为 1,并保证每列最多只包含两个事件。
即Alias Table构建完成,得到两个数组,alias:保存着每列中加入的事件,如图即为【2,null,1,1】;prab:保存着每列事件的概率,如图即为【2/3,1,1/3,1/3】。
代码实现思想:乘以事件数之后先将事件分成两部分,一个小于1(smaller),一个大于1(larger),然后分别从这两部分中取数据,用大的补小的使其为 1,如果大的剩余值小于1,加入smaller中,否则还是放回larger中,直到smaller或larger为空。
def alias_setup(probs):
'''
Compute utility lists for non-uniform sampling from discrete distributions.
Refer to https://hips.s