Es posible porque PageRank era una forma de valor propio y es por eso que se introdujo MapReduce. Pero parece que hay problemas en la implementación real, como que cada computadora esclava tiene que mantener una copia de la matriz.cómo implementar el cálculo de valores propios con MapReduce/Hadoop?
Respuesta
PREÁMBULO:
Dado el secuestro de la derecha de los datos, se podría lograr resultados de computación en paralelo sin un conjunto completo de datos en cada máquina.
Tomemos por ejemplo el siguiente bucle:
for (int i = 0; i < m[].length; i++)
{
for (int j = 0; j < m[i].length; j++)
{
m[i][j]++;
}
}
Y dada una matriz de la siguiente distribución: existen
j=0 j=1 j=2
i=0 [ ] [ ] [ ]
i=1 [ ] [ ] [ ]
i=2 [ ] [ ] [ ]
construcciones paralelas de tal manera que la columna de la J se puede enviar a cada equipo y la las columnas individuales se calculan en paralelo. La parte difícil de la paralelización viene cuando tienes bucles que contienen dependencias.
for (int i = 0; i < m[].length; i++)
{
for (int j = 0; j < m[i].length; j++)
{
//For obvious reasons, matrix index verification code removed
m[i][j] = m[i/2][j] + m[i][j+7];
}
}
Obviamente un bucle como la de arriba se vuelve extremadamente problemático (notar los indexadores de la matriz.) Pero sí existen técnicas para desenrollar este tipo de bucles y la creación de algoritmos paralelos eficaces.
RESPUESTA:
Es posible que Google ha desarrollado una solución para calcular un valor propio sin mantener una copia de la matriz en todos los equipos esclavos. O bien, usaron algo como Monte Carlo o algún otro Approximation Algorithm para desarrollar un cálculo "lo suficientemente cerca".
De hecho, iría tan lejos como para decir que Google habrá hecho todo lo posible para hacer que cualquier cálculo requerido para su algoritmo de PageRank sea lo más eficiente posible. Cuando se ejecutan máquinas como these y this (observe el cable Ethernet) no puede transferir grandes conjuntos de datos (cientos de gig) porque es imposible debido a sus limitaciones de hardware de las tarjetas NIC básicas.
Dicho esto, Google es bueno para sorprender a la comunidad de programadores y su implementación podría ser completamente diferente.
postámbulo:
Algunos buenos recursos para computación paralela incluiría OpenMP y MPI. Ambas implementaciones paralelas abordan la informática paralela desde paradigmas muy diferentes, algunos de los cuales se derivan de la implementación de la máquina (clúster frente a computación distribuida).
"Es completamente posible que se calcule un valor propio sin mantener una copia de la matriz en todas las computadoras esclavas". ??? ¿Cómo llegaste a esa conclusión? Las matrices de PageRank son escasas. –
@Jason - Mi significado y cómo lo escribí no eran lo mismo. Hice una edición para ese efecto. Gracias por señalar eso. –
Sospecho que es intratable para la mayoría de las matrices, excepto aquellas con estructuras especiales (por ejemplo, matrices dispersas o w/ciertos patrones de bloque). Hay demasiado acoplamiento entre los coeficientes de la matriz y los valores propios.
PageRank usa un muy sparse matrix de una forma especial, y cualquier conclusión del cálculo de sus valores propios casi con certeza no se extiende a las matrices generales. (editar: aquí está another reference que se ve interesante)
Me puedo responder a mí mismo ahora.El algoritmo de PageRank aprovecha una matriz dispersa donde debe converger en el valor propio con varias auto-multiplicaciones. Por lo tanto, en la práctica de PageRank, el procedimiento de Mapa/Reducir es válido. Puede realizar una multiplicación de matriz en el procedimiento Map y formar una matriz dispersa en el procedimiento Reducir. Pero para el hallazgo de valores propios de la matriz general, sigue siendo un problema difícil.
PageRank resuelve el problema del autovector dominante al encontrar iterativamente la condición de flujo discreto de estado estable de la red.
Si NxM matriz A describe el peso enlace (cantidad de flujo) desde el nodo n al nodo m, entonces
p_{n+1} = A . p_{n}
En el límite donde p ha convergido a un estado estacionario (p_n + 1 = p_n) , este es un problema eigenvector con eigenvalue 1.
El algoritmo de PageRank no requiere que la matriz se mantenga en la memoria, pero es ineficiente en matrices densas (no dispersas). Para matrices densas, MapReduce es la solución incorrecta, necesita localidad e intercambio amplio entre nodos, y debería mirar a LaPACK y MPI y sus amigos.
Puede ver una implementación de pagerank de trabajo en el wukong library (transmisión de hadoop para ruby) o en el Heretrix pagerank submodule. (El código se ejecuta independientemente del heretrix Heretrix)
(exención de responsabilidad: Soy un autor de wukong.)
El Apache hama proyecto tiene alguna aplicación interesante del algoritmo de valor propio Jacobi. Funciona en hadoop. Tenga en cuenta que la rotación ocurre en el escaneo de la matriz no en el mapa de reducir.
- 1. Problema con los valores propios de cálculo usando mathematica
- 2. ¿Cómo calcula OPENCV los valores propios y los vectores propios?
- 3. valores propios en MATLAB
- 4. python numpy ordenar valores propios
- 5. Tratando con los valores faltantes para el cálculo de correlaciones
- 6. Valores propios de precisión cuádruple, vectores propios y logaritmos de matriz
- 7. Usando SQL, ¿cómo actualizo las filas, usando sus propios valores?
- 8. ¿Puedo usar Lapack para calcular los valores propios y vectores propios de matrices dispersas grandes?
- 9. Escaso eigsh de Scipy() para valores propios pequeños
- 10. El cálculo de la diferencia porcentual entre dos valores
- 11. ¿Cómo implementar IEqualityComparer para devolver valores distintos?
- 12. ¿Cómo puedo extender datetime.datetime de Python con mis propios métodos?
- 13. ¿Detecta nombres propios con WordNet?
- 14. el cálculo de los valores atípicos en R
- 15. Trazar comportamientos propios con matplotlib
- 16. ¿Cómo implementar "grupo por valores" en NSMutableArray?
- 17. ¿Cómo implementar enum con genéricos?
- 18. utilizando valores propios para comprobar la singularidad: identificar columnas colineales
- 19. Estructura de datos utilizada para implementar hojas de cálculo
- 20. Cálculo de diferencia con el registro anterior
- 21. En Clojure, ¿cómo puedo implementar interfaces de recopilación Clojure estándar en mis propios registros y tipos?
- 22. Extendiendo Protobuf con mis propios métodos
- 23. Obtener el porcentaje de columnas que se completaron mediante el cálculo de valores nulos
- 24. cálculo de fórmulas definidas por el usuario (con C++)
- 25. ¿Cómo evitar el cálculo innecesario?
- 26. Eliminar valores atípicos del cálculo del coeficiente de correlación
- 27. Cómo escribir propios métodos de registro para propios niveles de registro
- 28. ¿Cómo implementar el conjunto vacío - ∅?
- 29. Cálculo, reemplace el punto con una coma
- 30. Lista de nombres propios?
Para MapReduce necesita un algoritmo de división y conquista. Eche un vistazo a http://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm –