2014-10-21 2 views
1

M은 N을 매우 쉽게 관리 할 수있는 MxN 행렬 X입니다. 행렬은 Wikipedia라는 용어 - 문서 코퍼스 형식입니다. 나는 계산할 필요가있다 :상수 메모리에서 이항에 의한 곱셈 행렬

X.dot(X.T) 

결과 (치수 MxM)는 메모리에 맞지만 매트릭스 X는 알 수 없다.

X 배치의 열을 반복하여 가장 잘 계산하려면 어떻게해야합니까? 코퍼스를 파일로 저장하고 각 문서 (예 : X 열)를 하나씩 반복 할 수 있습니다. 반복적으로 X * X를 구축 할 수있는 방법이 있습니까?

나는 이것을 위해 Numpy와 일하게되었지만 실제로 알고리즘에 대한 설명은 훌륭했습니다.

+0

무엇 'X = np.memmap (..)'이라면 어떻게됩니까? – jfs

+0

희소 행렬로 작업 해 보셨습니까? http://docs.scipy.org/doc/scipy/reference/sparse.html –

+1

'M은 관리가 가능하지만 N은 매우 크다.''NxN '은 메모리에 들어갈 것이지만 ... X는 그렇지 않을 것이다. '이해가 안된다. – ssm

답변

2

당신은 매트릭스 제품의 정의 사용할 수 있습니다

block_size = 256 
Y = np.zeros((M, M), dtype=float) 
for j in xrange(0, N, block_size): 
    Xb = X[:,j:(j+block_size)] 
    Y += Xb.dot(Xb.T) 

편집 : 성능을 향상시킬 수 있습니다 더 큰 블록을 사용하여

Y = np.zeros((M, M), dtype=float) 
for j in xrange(N): 
    Y += X[:,np.newaxis,j] * X.T[j,np.newaxis,:] 

는 첫 번째 예에서 np.newaxis를 잊어

+0

아, 이해가된다. 고마워. 나는 거기에 더 많은 트릭을 기대했다. – pdowling