파이썬 라이브러리 Nimfa으로 매우 큰 행렬을 인수 분해하려고합니다. 행렬이 너무 커서 메모리에 dence 형식으로 생성 할 수 없으므로 대신 scipy.sparse.csr_matrix을 사용합니다.Nimfa를 사용한 희소 행렬 인수 분해는 암시 적 0의 경우 매우 느립니다.
라이브러리에는 Snmf: Sparse Nonnegative Matrix Factorization (SNMF)이라고하는 희소 행렬 함수가 있는데, 이는 내가 찾고있는 것으로 보입니다.
성능 문제가 발생했을 때 (메모리 표현이 아닌 속도가 아니라) 인수 분해와 관련하여 심각한 성능 문제가 있었지만 아직 단순한 10 x 95 매트릭스를 고려하지 못했습니다.
이것은 내가 테스트 매트릭스를 구축하는 방법입니다
m1 = lil_matrix((10, 95))
for i in xrange(10):
for j in xrange(95):
if random.random() > 0.8: m1[i, j] = 1
m1 = csc_matrix(m1)
를이 내가 그것을
t = time()
fctr = nimfa.mf(m1,
seed = "random_vcol",
rank = 2,
method = "snmf",
max_iter = 15,
initialize_only = True,
version = 'r',
eta = 1.,
beta = 1e-4,
i_conv = 10,
w_min_change = 0)
print numpy.shape(m1)
a = nimfa.mf_run(fctr)
print a.coef()
print a.basis()
print time() - t
이 전혀 완료하지 않는 것 실행하는 방법입니다. 하지만 m1.todense()를 수행하면 초 단위로 완료됩니다. 내 실제 매트릭스를 instanciate 수 없기 때문에 이것은 정말 좋은 해결책이 아닙니다.
나는 다른 scipy.sparse 매트릭스 형식을 시도했지만 아무 소용이 없다 : csc_matrix, csr_matrix 및 dok_matrix.
잘못된 매트릭스 형식을 사용하고 있습니까? snmf 알고리즘은 어떤 행렬 연산을 신속하게 실행해야합니까? 제가 간과하고있는 다른 실수가 있습니까?
제안 : 오픈 소스 패키지이므로 소스 코드를 살펴보면 내용을 명확히 알 수 있습니다. –
어쩌면 http://scicomp.stackexchange.com/에서이 질문을 할 수 있습니다. – astrojuanlu