【问题标题】:Taking Exponential of a Sparse matrix取稀疏矩阵的指数
【发布时间】:2017-10-06 22:18:25
【问题描述】:
A=sc.array([[0,2,1],[2,0,3],[1,3,0]])    
sA = sp.csc_matrix(A)
Q2=np.exp(A)
print Q2
Q1=sp.linalg.expm(sA)
print (Q1)  

我正在使用大型数据集邻接矩阵,我需要对矩阵进行指数运算(我正在使用 csc 稀疏矩阵表示)。我正在使用上面的玩具数据集测试错误并找到 scipy.sparse.linalg。对于同一个 numpy 数组,expm 给出的答案与 numpy.exp 不同。sparse.linalg 是否应该对 numpy 给出一个接近的答案? 两个输出都已附加。答案甚至不接近。

【问题讨论】:

    标签: python numpy matrix sparse-matrix


    【解决方案1】:

    np.exp 是逐个元素的指数。 expm 是一个矩阵指数,一个非常不同的计算。

    In [539]: A = np.array([[0,2,1],[2,0,3],[1,3,0]])
    In [541]: np.exp(A)
    Out[541]: 
    array([[  1.        ,   7.3890561 ,   2.71828183],
           [  7.3890561 ,   1.        ,  20.08553692],
           [  2.71828183,  20.08553692,   1.        ]])
    In [542]: np.exp?
    In [543]: np.exp(2)
    Out[543]: 7.3890560989306504
    

    https://en.wikipedia.org/wiki/Matrix_exponential#Computing_the_matrix_exponential'

    In [545]: from scipy.sparse import linalg
    In [547]: linalg.expm(A)
    Out[547]: 
    array([[ 13.45868182,  18.62459092,  16.65146966],
           [ 18.62459092,  26.50610262,  23.85956737],
           [ 16.65146966,  23.85956737,  21.61331982]])
    

    我不知道是否有一个函数可以做稀疏指数,但是可以使用以下方法评估这些片段:

    In [565]: sA = sparse.csc_matrix(A)
    In [566]: np.exp(sA.data)
    Out[566]: 
    array([  7.3890561 ,   2.71828183,   7.3890561 ,  20.08553692,
             2.71828183,  20.08553692])
    In [567]: np.exp(0)
    Out[567]: 1.0
    

    由于exp(0) 为 1,因此即使使用稀疏矩阵,结果也是密集的。因此,将稀疏矩阵转换为密集矩阵并进行密集计算同样容易(并且可能更快)。


    正如@Desire 评论的那样,有一个np.expm1 函数。并且稀疏矩阵有

    In [574]: sA.expm1().A
    Out[574]: 
    array([[  0.        ,   6.3890561 ,   1.71828183],
           [  6.3890561 ,   0.        ,  19.08553692],
           [  1.71828183,  19.08553692,   0.        ]])
    In [575]: sA.expm1().A+1
    Out[575]: 
    array([[  1.        ,   7.3890561 ,   2.71828183],
           [  7.3890561 ,   1.        ,  20.08553692],
           [  2.71828183,  20.08553692,   1.        ]])
    

    此方法将np.expm1 应用于其data,并返回具有相同稀疏度的副本。 np.expm1(sA) 也可以。

    sA.expm1()+1 不起作用。您必须先使矩阵密集。

    【讨论】:

    • 那么如何对稀疏矩阵进行元素指数?
    • 指数将是密集的,因为exp(0) 是 1。所以稀疏计算虽然可能,但可能没有什么优势。查看我的编辑。
    • np.exp 可以处理大型矩阵吗?另外我需要在获得乘法后进行乘法运算,所以先将稀疏转换为密集然后再转换为稀疏进行乘法运算不会效率低下吗?
    • 为什么需要回到稀疏的乘法? exp 不会稀疏(除非原始有很多 -inf 值。
    • 可以将np.expm1 应用于一个稀疏矩阵,该矩阵按元素计算exp(x)-1。由于 0 映射到 0,因此保留了稀疏性。 (也就是说,在邻接矩阵的上下文中,我不知道需要这种计算来做什么。)@ChaitaliSarkar
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多