Python 与numpy阵列相比,稀疏表示中的输出不同
上面给出了两个基本相同的函数,除了func1用于numpy数组,func2用于scipy数据稀疏表示。由于我现在处理的是大数据,所以我想将代码转换为稀疏表示,但对于相同的输入,输出不同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
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]]