(这是我第一次提问,如果您觉得标签或描述有问题,请告诉我,谢谢!)
我正在做一个工作Matrix Factorization
并使用模块sklearn.decomposition.nmf
该模块使用另一个模块
from sklearn.decomposition.cdnmf_fast import _update_cdnmf_fast
这个模块来自文件cdnmf_fast.so
你可以在这个网站上查看它的源代码
/sklearn/decomposition/cdnmf_fast.pyx
我们可以看到它使用C语言和“ with nogil:",所以我认为它必须使用并行化。所以我写了一个类似的代码来测试它,如下所示:
from sklearn.decomposition.cdnmf_fast import _update_cdnmf_fast
import numpy as np
from numpy import *
M = 3
X = zeros((M,M), dtype="float64")
U = ones((M,M), dtype="float64")
V = np.arange(M*M).reshape(M,M).astype("float64")
permutation = np.arange(M)
print X
print U
print V
print permutation
x = _update_cdnmf_fast(X,U,V,permutation)
print X
预期结果是 X=X+VW*U=0+V-0=V。但是,结果很奇怪,而且比 np.dot() 慢得多。然后我把这段代码改成普通的python代码,而不是并行化代码。结果和以前一样。所以我确信它的并行化不起作用。因为它在改变 X 的同时使用了 X,所以结果当然是错误的。我不知道为什么它的并行化不起作用。是由于模块的错误还是我导入方式的方法?
实际上,当我使用 sklearn.decomposition.nmf 模块时,这让我很担心,我不确定我什么时候使用这个模块,它的并行化是否也不起作用。所以我想知道它是如何使并行化工作的。
谢谢您的帮助!