2013-05-25 5 views
3

파이썬 라이브러리 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 알고리즘은 어떤 행렬 연산을 신속하게 실행해야합니까? 제가 간과하고있는 다른 실수가 있습니까?

+0

제안 : 오픈 소스 패키지이므로 소스 코드를 살펴보면 내용을 명확히 알 수 있습니다. –

+0

어쩌면 http://scicomp.stackexchange.com/에서이 질문을 할 수 있습니다. – astrojuanlu

답변

3

나는 파고를했고 스파 스 구현에 버그가있는 것 같습니다. 그게 뭔지는 모르겠지만 _spfcnlls len (f_set)에서 line 289을 보면 절대로 줄어들지 않으며 루프는 영원히 계속됩니다. 행렬이 희소하지 않은 경우 해당 메서드는 호출되지 않습니다. github 저장소 here에 대한 문제를 열었습니다.

한편, numpy 또는 scipy에는 필요에 맞는 인수 분해 함수가 있습니까?