文章目录
说明
临时起意,记一下运算相关处理技巧
除法分母为零
numpy自动处理为inf., 并给出runtime warning
这个在之前训练grarep遇到过多次,thunlp的OpenNE没给出处理方法,现在看spagan给出了,记一下
RuntimeWarning: divide by zero encountered in power
SPAGAN处理:
d_inv_sqrt = np.power(rowsum, -0.5).flatten()
d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0.
这一点之前在Link Prediction用embedding计算score的时候也遇到过,当时就粗暴用了分母加一个e-15处理,但其实对分值分布还是有影响,直接去掉不要可能效果更具有解释性
(后续对比,挖坑待补)
GCN 邻接矩阵处理
normalization用度数归一,处理为表示形式:D**(-.5)AD**(-.5)
注:使用sp用dense思考,与sp的储存形式无关;具体使用场景需要考虑访问的顺序,可以大大降低访存时间,稀疏矩阵各种类型清楚介绍
adj = sp.coo_matrix(adj)
rowsum = np.array(adj.sum(1)) # dense思维
d_inv_sqrt = np.power(rowsum, -0.5).flatten() # 只有用np.narray flatten才有效,matrix不会改变
d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0. # 参见上条记录
d_mat_inv_sqrt = sp.diags(d_inv_sqrt)
return adj.dot(d_mat_inv_sqrt).transpose().dot(d_mat_inv_sqrt).tocoo()
numpy.where(condition, [x, y])
对于直接处理ndarray比较方便,一定程度上类似lambda
-
如果提供了x和y:
x和y是compatible的format,生成一个新的ndarray,if true选择x的对应元素,否则选择y的对应元素,如(来自官方文档)和另一个例子:>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.where(a < 5, a, 10*a) array([ 0, 1, 2, 3, 4, 50, 60, 70, 80, 90])
另一个例子
>>> labels = np.eye(3) >>> labels array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) >>> np.where(labels) (array([0, 1, 2]), array([0, 1, 2])) >>> np.where(labels, [2,2,2], [3,3,3]) array([[2, 3, 3