最近在学习node2vec时,有涉及alias 采样的算法,对于我来说真的需要好好学习一下,为了加深理解,于是有了这篇笔记,接下涉及到的其他的算法,也会在这边记录下来,越努力越幸运。
- 算法理论基础 :
- 大概罗列几个注意点:
- 按照均值归一化,而不是最大值
- 每列事件中最多包含两个不同事件 ,超过两个就奔溃了
- 博文, 更快的构建方法中提到 一个更好的方法,代码就是基于这个更好的方法实现的
Python代码:
"""
作者:Troublemaker
功能:alias method 算法
日期:2019/11/22 16:15
脚本:alias_method.py
"""
import numpy as np
def create_alias_table(Prob_val):
"""
:param Prob_val: 传入概率列表
:return: 返回一个accept 概率数组 和 alias的标号数组
"""
L = len(Prob_val)
accept_prob = np.zeros(L)
alias_index = np.zeros(L, dtype=np.int)
small_queue = []
large_queue = []
for index, prob in enumerate(Prob_val):
accept_prob[index] = L*prob
if accept_prob[index] < 1.0:
small_queue.append(index)
else:
large_queue.append(index)
while small_queue and large_queue:
small_index = small_queue.pop()
large_index = large_queue.pop()
alias_index[small_index] = large_index
accept_prob[large_index] = accept_prob[large_index] + accept_prob[small_index] - 1.0
if accept_prob[large_index] < 1.0:
small_queue.append(large_index)
else:
large_queue.append(large_index)
return accept_prob, alias_index
def alias_smaple(accept_prob, alias_index):
N = len(accept_prob)
random_num1 = int(np.floor(np.random.rand()*N))
random_num2 = np.random.rand()
if random_num2 < accept_prob[random_num1]:
return random_num1
else:
alias_index[random_num1]
lis = [1/2, 1/3, 1/12, 1/12]
get = create_alias_table(lis)
print(get)
val = alias_smaple(get[0], get[1])
print(val)