Python 与numpy阵列相比,稀疏表示中的输出不同

Python 与numpy阵列相比,稀疏表示中的输出不同,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,上面给出了两个基本相同的函数,除了func1用于numpy数组,func2用于scipy数据稀疏表示。由于我现在处理的是大数据,所以我想将代码转换为稀疏表示,但对于相同的输入,输出不同 import numpy as np import scipy as sc from sklearn.preprocessing import normalize import scipy.sparse as sp import numpy import numpy as np import scipy.spar

上面给出了两个基本相同的函数,除了func1用于numpy数组,func2用于scipy数据稀疏表示。由于我现在处理的是大数据,所以我想将代码转换为稀疏表示,但对于相同的输入,输出不同

import numpy as np
import scipy as sc
from sklearn.preprocessing import normalize
import scipy.sparse as sp
import numpy
import numpy as np
import scipy.sparse as sp




def func1(A,c,eps,maxiter):
    c=0.8
    eps=1e-4
    maxiter=20
    n=sc.shape(A)[0]                   
    sim=sc.eye(n)
    sim_prev=sc.zeros((n,n))    
    I=sc.eye(n)
    P= normalize(A, norm='l1', axis=0)    
    Q=P*(1-sc.exp(-A))        
    for t in range(maxiter):

        sim=c*(sc.dot(Q.T,sim)) + (1-c)*I

    return sim


def func2(A,c,maxiter):
    c=0.8
    eps=1e-4
    maxiter=20
    n=sp.csr_matrix.get_shape(A)[0]    
    sim=sp.eye(n)    
    I=sp.eye(n)
    P= normalize(A, norm='l1', axis=0) 

    Q =-(P*(np.expm1(-A)))

    for t in range(maxiter):


        sim=c*(sc.dot(Q.T,sim)) + (1-c)*I

    return sim

你在密集型中使用了元素矩阵乘法,在稀疏型中使用了矩阵乘法

它可以归结为
A*B
,在numpy数组和scipy.sparse矩阵方面有不同的含义。由于这取决于所使用的形状,我有点害怕给出一般规则,建议阅读numpy和scipy.sparse的文档(简化:a*B=numpy数组的元素乘法,而a.dot(B)矩阵乘法;a*B=稀疏矩阵的矩阵乘法)

更改(仅稀疏版本):

致:

哪些产出:

Q =-(P.multiply(np.expm1(-A)))    # elementwise-multiplication

填写虚假数据(A和c),以及您的导入。这使得调试更加容易。显然,第一步是在每行之后添加打印,并寻找第一个差异。我想你确实检查了你的数学,关于+P-P-stuff@sascha是的+P-P的数学是correct@sascha我添加了所有相关信息sim=c*(sc.dot(Q.T,sim))+(1-c)*这行在稀疏乘法中也会改变吗?只需改变我显示的一行!Numpy的点相当于兼容形状的矩阵乘法!而scipy.sparse也会对dot进行mat mul。阅读这些文档可以得到一种感觉。@ChaitaliSarkar那段代码对我来说确实很有趣。我从来没有看过这个expm1函数,并且检查它,包括你的外部否定,现在对我来说很有意义(特别是expm1的存在和稀疏矩阵缺少的exp(不是没有理由的!),所以我也学到了一些东西!
Q =-(P*(np.expm1(-A)))            # matrix-multiplication
Q =-(P.multiply(np.expm1(-A)))    # elementwise-multiplication
dense
[[0.25619944 0.04951776 0.04318623 0.01252072 0.04318623]
 [0.07427664 0.24367873 0.01252072 0.06161358 0.01252072]
 [0.12955869 0.02504144 0.22183936 0.00633153 0.02183936]
 [0.03756215 0.12322716 0.00633153 0.23115801 0.00633153]
 [0.12955869 0.02504144 0.02183936 0.00633153 0.22183936]]
sparse
[[0.25619944 0.04951776 0.04318623 0.01252072 0.04318623]
 [0.07427664 0.24367873 0.01252072 0.06161358 0.01252072]
 [0.12955869 0.02504144 0.22183936 0.00633153 0.02183936]
 [0.03756215 0.12322716 0.00633153 0.23115801 0.00633153]
 [0.12955869 0.02504144 0.02183936 0.00633153 0.22183936]]