새로운 솔루션
를 작동 할 수 있습니다, 나는 조사하기로 결정 corrcoef()
코드를 사용했으며 다음 구현을 수행하는 데 영감을 받았습니다.
ms = data.mean(axis=1)[(slice(None,None,None),None)]
datam = data - ms
datass = np.sqrt(scipy.stats.ss(datam,axis=1))
for i in xrange(rows):
temp = np.dot(datam[i:],datam[i].T)
rs = temp/(datass[i:]*datass[i])
통해 각 루프는 I 및 I 행 내지 마지막 행의 행 사이의 피어슨 계수를 생성한다. 그것은 매우 빠릅니다. 계수와 다른 몇 가지 사항을 중복 계산하지 않기 때문에 적어도 corrcoef()
을 사용하는 것보다 1.5 배 빠릅니다. 또한 더 빠를 것이며 50,000 행 행렬에 대한 메모리 문제를주지 않을 것입니다. 그 이유는 각각의 r 세트를 저장하거나 다른 세트를 생성하기 전에이를 처리 할 수 있기 때문입니다. r의 장기간의 데이터를 저장하지 않고, 꽤 새로운 노트북에서 분당 50,000 x 10 세트의 무작위로 생성 된 데이터에서 위의 코드를 실행할 수있었습니다.
올드 솔루션
첫째, 나는 화면에 R의를 인쇄하는 것을 권장하지 않습니다. 100 행 (10 열)의 경우 인쇄시 19.79 초와 코드를 사용하지 않은 경우 0.301 초 사이의 차이입니다. 그냥 r을 저장하고 나중에 원하면 사용하거나, 가장 큰 r을 찾는 것처럼 진행하면서 처리하십시오.
둘째, 일부 수량을 중복 계산하지 않아도 비용을 절약 할 수 있습니다. Pearson 계수는 행이 사용될 때마다 계산하지 않고 미리 계산할 수있는 일부 수량을 사용하여 scipy에서 계산됩니다. 내가 직선 scipy을 통해 약 4.8 배의 속도 향상을 얻을
r = np.zeros((rows,rows))
ms = data.mean(axis=1)
datam = np.zeros_like(data)
for i in xrange(rows):
datam[i] = data[i] - ms[i]
datass = scipy.stats.ss(datam,axis=1)
for i in xrange(rows):
for j in xrange(i,rows):
r_num = np.add.reduce(datam[i]*datam[j])
r_den = np.sqrt(datass[i]*datass[j])
r[i,j] = min((r_num/r_den), 1.0)
:. 또한, 아래의 코드를 사용하여 너무 그래서 스크래치하자도 pearsonr()
에 의해 반환되는 p- 값을 (사용하지 않는 P- 값 물건을 제거했을 때 코드 - 8.8 배로 P 값 물건을 남겨두면 (나는 수백 개의 열이있는 10 개의 열을 사용했다.) 또한 같은 결과를 얻는 지 확인했다. 정말 큰 개선이지만 도움이 될 것입니다.
궁극적으로, (50000) * (50001)/2 = 1,250,025,000의 피어슨 계수를 계산하는 문제에 봉착했습니다 (정확하게 계산하는 경우). 그게 많이 있습니다. 그런데 실제로는 각 행의 Pearson 계수를 계산할 필요가 없습니다 (1과 같음). 그러나 피어슨 계수를 계산하면 5 만원을 절약 할 수 있습니다. 위의 코드를 사용하면 소규모 데이터 집합의 결과를 기반으로 데이터에 10 개의 열이있는 경우 계산을 수행하는 데 약 4 시간이 걸릴 것으로 예상됩니다.
위의 코드를 Cython 또는 유사한 것으로 가져 가면 약간의 개선 효과를 얻을 수 있습니다. 운이 좋다면 곧장 Scipy보다 10 배 향상 될 것으로 기대합니다. 또한 pyInTheSky에서 제안한 것처럼 멀티 프로세싱을 할 수 있습니다.
나는 여기서 무엇을 의미하는지에 대한보다 철저한 예를보고 싶습니다. – vgoklani
내 대답은이 시점에서이 질문에서 멀리 떨어져 있다고 생각하지만 다중 처리에 관심이있는 경우 http://docs.python.org/library/multiprocessing.html ... 본질적으로 행을 순환하는 대신 체크 아웃하십시오. , 당신은 함수와 쓰레드 풀을 만들고 그냥 p.map (myfunc, xrange (rows)) – pyInTheSky