2016-07-04 7 views
0

이 유클리드 거리 계산을 최적화하는 현명한 방법을 찾고 있습니다. 이 계산은 다른 모든 벡터와의 평균 거리를 찾고 있습니다.반복 된 sklearn euclidean 거리 최적화

내 벡터 배열이 너무 커서 다음과 같이 처리 할 수 ​​없습니다. eucl_dist = euclidean_distances (eigen_vs_cleaned) 행별로 루프를 실행 중입니다.

일반적인 eigen_vs_cleaned 모양은 현재 (300000,1000) 이상이며 더 길을 가야합니다. (200000010000처럼)

더 스마트 한 방법?

eucl_dist_meaned = np.zeros(eigen_vs_cleaned.shape[0],dtype=float) 

from sklearn.metrics.pairwise import euclidean_distances 
for z in range(eigen_vs_cleaned.shape[0]): 
    if z%10000==0: 
     print(z) 
    eucl_dist_temp = euclidean_distances(eigen_vs_cleaned[z].reshape(1, -1), eigen_vs_cleaned) 
    eucl_dist_meaned[z] = eucl_dist_temp.mean(axis=1) 

답변

0

Im 아니요 python/numpy guru하지만이 작업을 최적화하기위한 첫 번째 단계입니다. 내 MacPro에서 더 잘 돌아갑니다.

eucl_dist_meaned = np.array(out,copy=True,dtype=float) 
:

from joblib import Parallel, delayed 
import multiprocessing 
import os 
import tempfile 
import shutil 

from sklearn.metrics.pairwise import euclidean_distances 

# Creat a temporary directory and define the array pat 
path = tempfile.mkdtemp() 
out_path = os.path.join(path,'out.mmap') 
out = np.memmap(out_path, dtype=float, shape=eigen_vs_cleaned.shape[0], mode='w+') 

eucl_dist_meaned = np.zeros(eigen_vs_cleaned.shape[0],dtype=float) 

num_cores = multiprocessing.cpu_count() 

def runparallel(row, out): 
    if row%10000==0: 
     print(row) 
    eucl_dist_temp = euclidean_distances(eigen_vs_cleaned[row].reshape(1, -1), eigen_vs_cleaned) 
    out[row] = eucl_dist_temp.mean(axis=1) 
    ## 

nothing = Parallel(n_jobs=num_cores)(delayed(runparallel)(r, out) for r in range(eigen_vs_cleaned.shape[0])) 

은 그럼 출력을 저장