how google funciona fases example como algorithm mapreduce

algorithm - google - calcular el algoritmo de arranque usando Map/Reduce



mapreduce example (1)

No estoy seguro de entender su pregunta.

Lo que finalmente quieres es SE (U). Después de algunos detalles matemáticos en las diapositivas 23 y 24, se calcula "trivialmente" con / sum_ {i} SE (U) _i

Usted mismo ha comprendido que el 4 y el último septiembre es un mapa reducido para obtener esta suma.

El tercer paso es un mapa reducido para obtener (estilo LaTeX)

SE(U)_i = /sum_{u in U_i} (r_{u,i} - r_i)^2

  • La función de reducción suma sobre u en U_i
  • La función de mapa divide los términos a sumar.

En Python esto podría parecer:

def map(Ui): '''''' Ui is the list of user who have rated the film i'''''' for user in Ui: results.append((user,(r_{u,i} - r_i)^2)) def reduce(results): '''''' Returns a final pair (item, SE(U)_i ) '''''' return (item, sum([value for user,value in results]))

Edit : Mi respuesta original fue incompleta. Déjame explicarte de nuevo.

Lo que en última instancia quieres es SE (U) para cada divisor.

El paso a prepara algunos datos útiles sobre los artículos. Las entradas emitidas se definen con:

key = (population_id, item) value = number: |U_i|, sum_of_ratings: /sum_{u / in U_i} r_{u,i} sum_of_squared_ratings: /sum_{u /in U_i} r_{u,i} ^2

  • La función de mapa explota las estadísticas sobre los elementos.
  • Las funciones reducidas calculan las sumas.

Ahora, para cualquier película divisoria M:

U_M = U_{+M} + U_{-M} + U_{M?}

El paso b computa explícitamente, para cada separador M, las estadísticas de las subpoblaciones pequeñas M + y M-.

NB me gusta / no me gustan los booleanos, es el identificador de subpoblación ''+'' o ''-''

Hay 2 nuevas entradas para cada elemento divisor:

key = (population_id, item, M, ''+'') value = number: |U_i(+)| sum_of_ratings: /sum_{u / in U_i(+)} r_{u,i} sum_of_squared_ratings: /sum_{u /in U_i(+)} r_{u,i} ^2 Same thing for ''-''

O si te gusta más la notación de dis / likers.

key = (population_id, item, M, dis/likers) value = number: |U_i(dis/likers)| sum_of_ratings: /sum_{u / in U_i(dis/likers)} r_{u,i} sum_of_squared_ratings: /sum_{u /in U_i(dis/likers)} r_{u,i} ^2

cf medio de la diapositiva 24

Nota: si considera que cada película puede ser un divisor, hay 2x | item | ^ 2 elementos de la segunda forma; eso es porque item -> (boolean, item, splitter) - que es mucho menos que tu 2 ^ | item | evaluación que no has explicado.

El paso c calcula, para cada divisor M, el SE estimado por cada película, es decir, SE (U_M) _i

Porque una suma se puede dividir entre sus diferentes miembros:

U_M = U_{+M} + U_{-M} + U_{M?} SE(U_M)_i = SE(U_M?)_i + SE(U_+M) + SE(U_-M)

con SE(U_{+M}) computado explícitamente con esta función de mapa:

def map(key, value): '''''' key = (population_id, item, M, dis/likers) '''''' value = count: 1 dist: (r_u,i - r_i)^2 emit key, value def reduce(key, values): '''''' This function explicitly computes the SE for dis/likers key = (population_id, item, M, dis/likers) value= count, dist '''''' emit key, sum(count, sum(dist))

Ahora todo lo que necesitamos es SE(U_{M?})_i que es un cálculo "trivial" dado en la diapositiva 24:

SE(?)_i = /sum_{u /in U_i(?)}{r_{u,i}^2} - (/sum r)^2 / |U_i(?)|

Por supuesto, no vamos a hacer estas grandes sumas, sino que usaremos el comentario justo arriba en la conferencia, y los datos ya calculados en el paso a (esa es la conclusión que extraigo de la diapositiva 24 de las últimas 3 ecuaciones)

SE(?)_i = /sum_{u /in U_i}{r_{u,i}^2} - /sum_{u /in U_i(''+''/''-'')}{r_{u,i}^2} - (...)/ (|U_i| - |U_i(''+''/''-''))

Entonces, este no es un Mapa / Reducir, solo es un paso final:

def finalize(key, values): for [k in keys if k match key]: '''''' From all entries get # from step a key = (population_id, item) value=(nb_ratings, sum_ratings, sum_ratings_squared) # from step b key = (population_id, item, M, ''+'') value=(nb_ratings_likers, sum_ratings_likers, sum_ratings_squared_likers) key = (population_id, item, M, ''-'') value=(nb_ratings_dislikers, sum_ratings_dislikers, sum_ratings_squared_dislikers) # from step c key = (population_id, item, M, ''+'') value=(se_likers) key = (population_id, item, M, ''-'') value=(se_dislikers) '''''' se_other = sum_rating_squared - sum_ratings_squared_likers - sum_ratins_squared_dislikers - sum_ratings_likers / (nb_ratings - (nb_ratings_likers)) - sum_ratins_squared_dislikers - sum_ratings_likers / (nb_ratings - (nb_ratings_likers)) emit key: (population_id, splitter, item) value : se_likers + se_dislikers + se_other

Paso d Finalmente, los últimos pasos calculan la SE para U_M. Es simplemente la suma de las entradas anteriores, y un Mapa / Reducción trivual:

Para un separador M:

SE(U_M) = /sum_i SE(U_M)_i = /sum_i SE(U_M?)_i + /sum_i SE(U_+M) + /sum_i SE(U_-M)

Esta pregunta fue originalmente una tarea que tenía, pero mi respuesta fue incorrecta y tengo curiosidad por saber cuál es la mejor solución para este problema.

El objetivo es calcular los aspectos clave del "algoritmo de arranque del sistema recomendado" mediante 4 pasos de reducción de mapas. Mi problema es con el 3er paso, así que solo traeré sus detalles.


entrada: registros de la forma:
1. (ID de población, artículo, número de usuarios de calificación, suma de calificaciones, suma de calificaciones al cuadrado)
2. (ID de población, elemento divisor, me gusta / no me gusta, elemento, número de usuarios de calificación, suma de calificaciones, suma de calificaciones al cuadrado)

La segunda forma es muy parecida a la primera forma, pero un registro para cada (divisor, me gusta / no me gusta) - donde me gusta es booleano.

Esto significa (creo) que hay 2 ^ | elementos | registros del formulario de segundos para cada registro del primer formulario ... (muchos compañeros se equivocaron (de nuevo, creo ...) asumiendo que hay la misma cantidad de registros del primer y segundo formulario)

Descripción de la tarea:

Este paso calculará, por película divisoria, el error cuadrado (SE) inducido por cada película.

  • Salida: registros del formulario (ID de población, elemento divisor, elemento, error cuadrado en el elemento dado una división en el divisor).

Insinuación:

asuma que existe una cadena que precede (en el orden de clasificación del sistema) cualquier ID de película divisora.

Esto debe hacerse dentro de un paso mapreduce!

fondo adicional:
Esto se aprendió en el contexto de "The Netflix Challange".

Definición SE:

EDITAR: se puede encontrar material adicional sobre el problema [se puede encontrar una descripción del problema de netflix e información matemática sobre el problema] en este enlace [diapositivas 12-24 especialmente]

EDIT2: tenga en cuenta que ya que estamos usando map / reduce, no podemos asumir que los registros de ORDEN serán procesados ​​[tanto en map como en reducir].