Trabajo en agrupamiento aglomerativo jerárquico en grandes cantidades de vectores multidimensionales, y noté que el mayor cuello de botella es la construcción de la matriz de distancia. Una implementación ingenua para esta tarea es la siguiente (en este caso en Python):Construcción paralela de una matriz de distancia
''' v = an array (N,d), where rows are the observations
and columns the dimensions'''
def create_dist_matrix(v):
N = v.shape[0]
D = np.zeros((N,N))
for i in range(N):
for j in range(i+1):
D[i,j] = cosine(v[i,:],v[j,:]) # scipy.spatial.distance.cosine()
return D
Me preguntaba cuál es la mejor manera de añadir algo de paralelismo a esta rutina. Una manera fácil sería romper y asignar el bucle externo a una cantidad de trabajos, p. si tiene 10 procesadores, cree 10 trabajos diferentes para diferentes rangos de i
y luego concatené los resultados. Sin embargo, esta solución "horizontal" no parece del todo correcta. ¿Hay algún otro algoritmo paralelo (o librerías existentes) para esta tarea? Cualquier ayuda sería muy apreciada.
¿No es esto lo que hace 'scipy.spatial.distance.cdist (XA, XB, 'cosine')' – TJD
Es en realidad, pero ¿esos métodos están paralelizados? Actualmente estoy usando 'pdist', pero lleva demasiado tiempo. – dkar
No en paralelo, pero probablemente mucho más rápido porque harías más del trabajo en código C nativo en lugar de hacerlo en python. – TJD