傻瓜基础运算相关处理

本文介绍了Python数值运算中的特殊处理,如除法分母为零时的自动处理,以及在图神经网络中GCN邻接矩阵的归一化处理。详细讲解了numpy的where函数和delete函数的使用,还有numpy的集合运算。此外,重点讨论了torch_sparse库中spmm函数的原理和使用,包括从scipy.sparse转换到torch.sparse的技巧,并通过实例解析了运算过程和常见错误。
摘要由CSDN通过智能技术生成

说明

临时起意,记一下运算相关处理技巧

除法分母为零

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

  1. 如果提供了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
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值