07.rhadoop

68
Data Science con R RHadoop Diego J. Bodas Sagi – Julio de 2014

Upload: maestria20090

Post on 11-Feb-2016

4 views

Category:

Documents


0 download

DESCRIPTION

hadoop

TRANSCRIPT

Page 1: 07.RHadoop

Data Science con R RHadoop

Diego J. Bodas Sagi – Julio de 2014

Page 2: 07.RHadoop

Data Science con R

Índice

Introducción RHadoop Instalación Interacción con HDFS Primeros ejemplos Trabajando con ficheros csv Ejercicio Rhadoop Regresión logística y clustering Resumen

2

Page 3: 07.RHadoop

Data Science con R

RHadoop

By Revolution Analytics (proveedor comercial líder de software para R) Se compone de tres paquetes independientes: • rhdfs: proporciona acceso a HDFS • rmr: permite ejecutar programas MapReduce (nueva

versión disponible rmr2) • rhbase: permite interactuar con Hbase

Además, tenemos algunos paquetes auxiliares • quick check: para depuración de procesos MapReduce

lanzados a través del paquete rmr • plyrmr: facilita operaciones de combinación y

manipulación de grandes conjuntos de datos. Buena eficiencia en algunas operaciones (superior a SQL)

3

Page 4: 07.RHadoop

Data Science con R

Preparación del entorno

Algunos elementos necesarios en el SO para que funcionen correctamente paquetes que trabajar con XML, Curl y HTTP

$ sudo yum update glib2 $ sudo yum install openssl-devel.x86_64

$ sudo yum -y install libxml2 libxml2-devel

$ sudo yum -y install curl

$ sudo yum -y install libcurl libcurl-devel

## Para manejo de imágenes

$ sudo yum install libpng-devel

$ sudo yum install libtiff

$ sudo yum install -y libjpeg-devel

4

Page 5: 07.RHadoop

Data Science con R

Instalación

Debemos gestionar adecuadamente las dependencias existentes. Los siguientes paquetes son exigidos como prerrequisito (instalar como root, desde la consola de R) (rJava ya lo hemos instalado en el tema anterior – no volver a instalar):

> install.packages(c(“rJava”, “Rcpp”,

“RJSONIO”,”itertools”,“bitops”,“digest”,

“functional”, “httr”, “devtools”,

“stringr”,“plyr”,“reshape2”),

dependencies=T)

Obligatorio – Opcional (mejoras) Chequear listado paquetes con: > library( )

5

Page 6: 07.RHadoop

Data Science con R

Variables de entorno

Editar el archivo Renviron como root $ nano /usr/lib64/R/etc/Renviron

Actualizar variables

###Environment variables for RHadoop

###Run file

HADOOP_CMD='/usr/bin/hadoop'

HADOOP_STREAMING='/usr/lib/hadoop-0.20-

mapreduce/contrib/streaming/hadoop‐streaming-2.0.0‐mr1-cdh4.4.0.jar'

6

Page 7: 07.RHadoop

Data Science con R

Instalando paquetes principales

rhdfs • https://github.com/RevolutionAnalytics/rhdfs/tree/master/build

rmr2 • https://github.com/RevolutionAnalytics/rmr2/tree/master/build

O, mucho mejor: • https://github.com/RevolutionAnalytics/RHadoop/wiki/Downloads

• Descargar las últimas versiones indicadas para linux de rhdfs y rmr2

7

Page 8: 07.RHadoop

Data Science con R

Instalación

Abrir en consola una sesión R como root >install.packages("/home/cloudera/Downloads/rhdfs

_1.0.8.tar.gz", dependencies=T, repos=NULL)

>install.packages("/home/cloudera/Downloads/rmr2_

3.1.2.tar.gz", dependencies=T, repos=NULL)

• Es posible que necesitemos instalar el paquete caTools que

contiene diversas utilidades y funciones de manipulación

8

Page 9: 07.RHadoop

Data Science con R

Interacción con HDFS a través de rhdfs # Load rhdfs library

library(rhdfs)

# Start rhdfs

hdfs.init()

# Basic "ls", path is mandatory

hdfs.ls("/user/cloudera")

# Create directory

work.dir <- "/user/cloudera/Hadoop_R_Course/AuxiliarTema7"

hdfs.mkdir(work.dir)

# And delete

hdfs.delete(work.dir)

# Create again

hdfs.mkdir(work.dir)

9

Page 10: 07.RHadoop

Data Science con R

Gross Product Ranking

Trabajaremos con datos del Producto Interior Bruto de varios países • http://data.worldbank.org/data-catalog/GDP-ranking-table

Los datos deben ser descargados y limpiados El profesor proporcionará los archivos necesarios

Country Code,Ranking,Country Name,GPD

USA,1,United States,16800000

CHN,2,China,9240270

JPN,3,Japan,4901530

DEU,4,Germany,3634823

FRA,5,France,2734949

GBR,6,United Kingdom,2522261

10

Page 11: 07.RHadoop

Data Science con R

Interacción con ficheros HDFS

# Write in HDFS our clean GPD file from World Bank

hdfs.put(

"/home/cloudera/Hadoop_R_Course/AuxiliarTema7/

Documents/cleanGDPfile.csv", work.dir)

# How to read file from HDFS

file.dir <- paste(work.dir, "cleanGDPfile.csv", sep = "/")

# Check file.dir

file.dir

# Get the file

theFile = hdfs.file(file.dir)

# Read

file.data = hdfs.read(theFile)

# What is file.data?

file.data

# raw data?????

11

Page 12: 07.RHadoop

Data Science con R

Accediendo a los datos

# raw to char

file.CharData = rawToChar(file.data)

# Now?

file.CharData

# Yes. See separators, but, is it not pretty?

# Try this

# textConnection creates a character vector

data = read.table(textConnection(file.CharData), quote = "", sep = ",")

# Problems? Maybe the text file is not correct

# See this line (5 elements not 4)

# IRN,32,Iran, Islamic Rep.;368904

# Oh no! Raw data!!!!!

# Problems with compose name like Iran, Islamic Rep.

12

Page 13: 07.RHadoop

Data Science con R

Solucionando algunos problemas

# Again with the new file

hdfs.put(

"/home/cloudera/Hadoop_R_Course/AuxiliarTema7

/Documents/ReallyCleanGDPfile.csv", work.dir)

file.dir <- paste(work.dir, "ReallyCleanGDPfile.csv",

sep = "/")

theFile = hdfs.file(file.dir)

# Read

file.data = hdfs.read(theFile)

file.CharData = rawToChar(file.data)

# Try this

data2 = read.table(textConnection(file.CharData),

quote = "", sep = ",")

# See data2. Fingers crossed!!!

data2

# Great!!!

13

Page 14: 07.RHadoop

Data Science con R

Otras opciones

# Other options. Line to line

reader = hdfs.line.reader(file.dir)

what.is.this = reader$read()

typeof(what.is.this)

what.is.this

# Some problems with no utf-8 characters

# Change encoding in textConnection o clean file

# See https://github.com/RevolutionAnalytics/rhdfs/blob/master/pkg/man/rhdfs.Rd

# list of functions available for rhdfs

14

Page 15: 07.RHadoop

Data Science con R

Más funciones

##### File Manipulations

# hdfs.copy, hdfs.move, hdfs.rename, hdfs.delete, hdfs.rm, hdfs.del,

# hdfs.chown, hdfs.put, hdfs.get

##### File Read/Write

# hdfs.file, hdfs.write, hdfs.close, hdfs.flush, hdfs.read, hdfs.seek,

# hdfs.tell, hdfs.line.reader, hdfs.read.text.file

##### Directory

# hdfs.dircreate, hdfs.mkdir

##### Utility

# hdfs.ls, hdfs.list.files, hdfs.file.info, hdfs.exists

##### Initialization

# hdfs.init, hdfs.defaults

15

Page 16: 07.RHadoop

Data Science con R

Procesos MapReduce

Los creadores de Rhadoop introducen una muy buena aproximación al concepto de mapeo Podría considerarse similar a las funciones de R lapply o tapply. Estas funciones nos permiten aplicar una función a un conjunto estructurado de datos small.ints = 1:1000

sapply(small.ints, function(x) x^2)

• Con MapReduce small.ints = to.dfs(1:1000)

mapreduce( input = small.ints,

map = function(k, v) cbind(v, v^2))

Evidentemente no es igual, ya que hadoop facilita la ejecución en paralelo de la fase de mapeo optimizando los recursos computacionales

16

Page 17: 07.RHadoop

Data Science con R

Funciones destacadas

“to.dfs”: forma principal de escribir en HDFS de forma escalable. Crea archivos temporales (“/tmp”). Comprueba el resultado de la sentencia en rojo anterior. Abandona la sesión de R (> quit()). Vuelve a comprobar. ¿Qué ha pasado?

17

Page 18: 07.RHadoop

Data Science con R

Nuestro primer proceso MapReduce

#################################

#IntroRHadoop.R

#################################

## laoding the libraries

library('rhdfs')

library('rmr2')

## initializaing the RHadoop

hdfs.init()

# defining the input data

small.ints = to.dfs(1:10) #1 to 10

# Hadoop object, can you see it?

small.ints

18

Page 19: 07.RHadoop

Data Science con R

The Job

## Defining the MapReduce job

mapreduce(

input = small.ints,

# The Mapper (no reducer)

map = function(k, v)

{

lapply(seq_along(v), function(r){

# The Uniform Distribution

# min = 0 and max = 1 by default

# Try z <- runif(3); z

x <- runif(v[[r]])

# keyval = (key, value) pair

keyval(r,c(max(x),min(x)))

})})

19

Page 20: 07.RHadoop

Data Science con R

Results

## Update here the path parameter collected from

last command output

## from.dfs to READ

output <- from.dfs('/tmp/file7db122119c22')

## Output in table format

# do.call constructs and executes a function call

table_output<- do.call('rbind',

lapply(output$val,"[[",2))

# Let's see it

table_output

20

Page 21: 07.RHadoop

Data Science con R

2nd Example

## Loading the RHadoop libraries

library('rhdfs')

library('rmr2')

## Initializaing the RHadoop

hdfs.init()

# This creates a sample from the binomial

groups = rbinom(32, n = 50, prob = 0.4)

# Check it

groups

# Now count how many times each outcome occurred

# Or, in other way...

# the length of each element of groups in groups

tapply(groups, groups, length)

21

Page 22: 07.RHadoop

Data Science con R

Lo mismo… con MapReduce # Write in HDFS

groups = to.dfs(groups)

# Run job and read results

# Other way, not needed to know the path to file

output <- from.dfs(

# The MapReduce Job

mapreduce(

input = groups,

# Emit 1 for each item

map = function(., v) keyval(v, 1),

# Reduce function = accumulate

reduce =

function(k, vv)

# easy, we only need to get the length of the

# iterable

keyval(k, length(vv))))

# Finally, let's see the results

output 22

Page 23: 07.RHadoop

Data Science con R

Ya está aquí… WordCount

Volveremos a leer el libro del Quijote Comienzo típico ## Loading the RHadoop libraries

library('rhdfs')

library('rmr2')

## Initializaing the RHadoop

hdfs.init()

23

Page 24: 07.RHadoop

Data Science con R

Encapsulando la función

wordcount = function(input,

# The output can be an HDFS path but

#if it is NULL some temporary file will

# be generated and wrapped in a big data

# object, like the ones generated by to.dfs

output = NULL,

pattern = " "){

# Defining wordcount Map function

wc.map = function(., lines) {

keyval(

unlist(strsplit(

x = lines,

split = pattern)),

1)}

24

Page 25: 07.RHadoop

Data Science con R

Reducer y Job

# Defining wordcount Reduce function

wc.reduce = function(word, counts ) {

keyval(word, sum(counts))}

# Defining MapReduce parameters by calling mapreduce function

mapreduce(input = input ,

output = output,

# You can specify your own input and output formats

# and produce binary formats with the functions

# make.input.format and make.output.format

input.format = "text",

map = wc.map,

reduce = wc.reduce,

# With combiner

combine = T)}

25

Page 26: 07.RHadoop

Data Science con R

Ejecución y resultados

# The Quijote again

# Running MapReduce Job by passing the Hadoop

# input directory location as parameter

wordcount('/user/cloudera/Hadoop_R_Course/

AuxiliarTema6/BookWordCount/quijote.txt')

# Retrieving the RHadoop MapReduce output

# data by passing output

# directory location as parameter

from.dfs("/tmp/file1b0817a5bcd0")

26

Page 27: 07.RHadoop

Data Science con R

Algunos formatos personalizados: csv

Ejecutaremos ahora un ejemplo típico en el proceso de aprendizaje de Rhadoop Analizaremos los datos comerciales de una compañía aérea El fichero de entrada está formateado como csv (separado por comas) La lectura y el trabajo se facilita si declaramos un tipo personalizado Los datos se pueden descargar en el directorio Download y descomprimir • http://stat-computing.org/dataexpo/2009/1987.csv.bz2

27

Page 28: 07.RHadoop

Data Science con R

Airline.R

library(rmr2)

library('rhdfs')

library(plyr)

hdfs.init()

# Put data in HDFS

hdfs.data.root = '/user/cloudera/rhadoop/airline'

hdfs.data = file.path(hdfs.data.root, 'data')

hdfs.mkdir(hdfs.data)

hdfs.put("/home/cloudera/Downloads/1987.csv",

hdfs.data)

hdfs.out = file.path(hdfs.data.root, 'out')

28

Page 29: 07.RHadoop

Data Science con R

Indicando el formato del fichero

29

Page 30: 07.RHadoop

Data Science con R

Mapper

# the mapper gets keys and values from the input formatter

# in our case, the key is NULL and the value is a data.frame from

# read.table()

#

mapper.year.market.enroute_time = function(key, val.df) {

# Remove header lines, cancellations, and diversions:

val.df = subset(val.df, Year != 'Year' & Cancelled == 0 &

Diverted == 0)

# We don't care about direction of travel, so construct a new

# 'market' vector

# with airports ordered alphabetically (e.g, LAX to JFK becomes

#'JFK-LAX')

market = with( val.df, ifelse(Origin < Dest,

paste(Origin, Dest, sep='-'),

paste(Dest, Origin, sep='-')) )

30

Page 31: 07.RHadoop

Data Science con R

Mapper (2)

# key consists of year, market

output.key = data.frame(year=as.numeric(val.df$Year),

market=market, stringsAsFactors=F)

# emit data.frame of gate-to-gate elapsed times (CRS and actual)

# + time in air

output.val = val.df[,c('CRSElapsedTime', 'ActualElapsedTime', 'AirTime')]

colnames(output.val) = c('scheduled', 'actual', 'inflight')

# and finally, make sure they're numeric while we're at it

output.val = transform(output.val,

scheduled = as.numeric(scheduled),

actual = as.numeric(actual),

inflight = as.numeric(inflight)

)

return( keyval(output.key, output.val) )

}

31

Page 32: 07.RHadoop

Data Science con R

Reducer

#

# the reducer gets all the values for a given key

# the values (which may be multi-valued as here) come in

# the form of a data.frame

#

reducer.year.market.enroute_time = function(key, val.df) {

output.key = key

output.val = data.frame(flights = nrow(val.df),

scheduled = mean(val.df$scheduled, na.rm=T),

actual = mean(val.df$actual, na.rm=T),

inflight = mean(val.df$inflight,

na.rm=T) )

return( keyval(output.key, output.val) )

}

32

Page 33: 07.RHadoop

Data Science con R

Job y ejecución

mr.year.market.enroute_time = function (input, output) {

mapreduce(input = input,

output = output,

input.format = asa.csv.input.format,

map = mapper.year.market.enroute_time,

reduce = reducer.year.market.enroute_time,

backend.parameters = list(

hadoop = list(D = "mapred.reduce.tasks=2")

),

verbose=T)

}

out = mr.year.market.enroute_time(hdfs.data, hdfs.out)

33

Page 34: 07.RHadoop

Data Science con R

Resultados

results = from.dfs( out )

results.df = as.data.frame(results,

stringsAsFactors=F )

colnames(results.df) = c('year', 'market',

'flights', 'scheduled', 'actual', 'inflight')

print(head(results.df))

34

Page 35: 07.RHadoop

Data Science con R

¡TU TURNO!

35

Page 36: 07.RHadoop

Data Science con R

Requisitos

Vamos a seguir trabajando con un archivo csv Nos apoyaremos en el ejemplo anterior Y en los datos que hemos obtenido del Banco Mundial sobre el Producto Interior Bruto de los países • http://databank.worldbank.org/data/download/GDP.csv

Trabajaremos con los datos limpios proporcionados por el profesor • Vigilar caracteres raros (se procesa mejor UTF-8) • Comas fuera de su sitio • Valores nulos

36

Page 37: 07.RHadoop

Data Science con R

Objetivo

Sencillo. Se trata de analizar mediante un proceso MapReduce cuántos países poseen un PIB superior al beneficio declarado de Apple en el 2012 El beneficio de Apple en este periodo fue de 156.508 millones de dólares americanos (misma unidad de medida que el GDP del fichero) • https://www.google.com/finance?q=NASDAQ:AAPL&fstyp

e=ii&ei=5eErUcCpB8KOwAOkQQ •

37

Page 38: 07.RHadoop

Data Science con R

Los datos

Recordemos el formato de los datos #########################################

# The data

# Code,Rank,Name,GDP

# USA,1,United States,14991300

# CHN,2,China,7318499

# JPN,3,Japan,5867154

# DEU,4,Germany,3600833

# FRA,5,France,2773032

# ....

#########################################

38

Page 39: 07.RHadoop

Data Science con R

Pasos a realizar

1. Cargar librerías necesarias 2. Iniciar rhdfs 3. Preparar los datos y la estructura de directorios. Mover el

archivo csv a HDFS en la siguiente ruta: /user/cloudera/Hadoop_R_Course/AuxiliarTema7/data

4. Definir el formato csv (gdp.csv.input.format ) 5. Definir el Mapper 6. Definir el Reducer 7. Definir el Job 8. Ejecutar 9. Observar resultados

39

Page 40: 07.RHadoop

Data Science con R

Comprobación de resultados

¿Es correcto el resultado obtenido? Compáralo con los datos que proporciona R sin emplear Rhadoop #################################

# Check results

myData <-

read.csv("/home/cloudera/Hadoop_R_Course/AuxiliarTema7/

Documents/ReallyCleanGDPfile.csv", header=TRUE)

all.gdp <- myData$GDP

length(all.gdp)

# 191 = 134 + 57

length(all.gdp[all.gdp < appleRevenue.2012])

length(all.gdp[all.gdp > appleRevenue.2012])

###################################

40

Page 41: 07.RHadoop

Data Science con R Fundamentos y conceptos previos

Diego J. Bodas Sagi

ALGORITMOS CON R Y HADOOP

Regresión logística y clustering con K-Means

41

Page 42: 07.RHadoop

Data Science con R

Regresión

Supongamos los siguientes datos ¿Podemos predecir el precio de otras casas en función de la superficie?

42

Page 43: 07.RHadoop

Data Science con R

Modelos de regresión

Existen varios modelos de regresión • Regresión lineal • Regresión exponencial • Regresión logarítmica • Regresión polinomial

Cada tipo de regresión da lugar un tipo de curva distinto Según el modelo a extrapolar nos puede convenir más un método u otro En ocasiones, debemos probar varios métodos y evaluarlos para saber cuál es más preciso

43

Page 44: 07.RHadoop

Data Science con R

Regresión logística

La regresión logística es un tipo de análisis de regresión utilizado para predecir el resultado de una variable categórica en función de las variables independientes o predictoras Se suele asociar a un problema de clasificación (aprendizaje supervisado) El número de posibles valores para la variable categórica debe estar limitado. Muy frecuentemente se emplea una variable binaria Es útil para modelar la probabilidad de un evento ocurriendo como función de otros factores El análisis de regresión logística se enmarca en el conjunto de Modelos Lineales Generalizados Las probabilidades que describen el posible resultado de un único ensayo se modelan, como una función de variables explicativas, utilizando una función logística

44

Page 45: 07.RHadoop

Data Science con R

Función logística

La función logística es una función matemática que aparece en diversos modelos de crecimiento de poblaciones, propagación de enfermedades epidémicas y difusión en redes sociales. Dicha función constituye un refinamiento del modelo exponencial para el crecimiento de una magnitud. Modela la función sigmoidea de crecimiento de un conjunto P

45

Page 46: 07.RHadoop

Data Science con R

Tipos de preguntas a las que responde

¿Será moroso este cliente o no? ¿Tendrá hipertensión el paciente? Dentro de los márgenes muy bajo, bajo, medio, alto y muy alto, ¿cuál es la probabilidad de que este paciente tenga un infarto?

46

Page 47: 07.RHadoop

Data Science con R

Descenso gradiente

El método del descenso del gradiente es un método iterativo para realizar una regresión logística El objetivo es ajustar los valores para una mejor predicción Un método de clasificación muy sencillo de clasificación binaria consiste en: • Normalizar los valores (rango [0, 1]) para evitar que un

atributo tenga más peso que otro • Calcular medias entre todos los atributos • Ajustar al valor (0, 1) más cercano a la media

En vez de la media se pueden emplear otras funciones, como la regresión logística Se itera el proceso hasta cumplir un determinado criterio de convergencia

47

Page 48: 07.RHadoop

Data Science con R

Regresión logística en R

# Loading Iris dataset

data(iris)

# Setting up target variable

target <- data.frame(isSetosa=(iris$Species == 'setosa'))

# Adding target to iris and creating new dataset

inputdata <- cbind(target,iris)

# Defining the logistic regression formula

formula <- isSetosa ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

# Running Logistic model via glm()

logisticModel <- glm(formula, data=inputdata, family="binomial")

48

Page 49: 07.RHadoop

Data Science con R

Regresión logística con RHadoop

#Nondependent variable into matrix

#"logic" --> function of the explanatory variable

# (similar to regression)

# If logic (p) is a linear function

# logit(p) = beta0 + beta1 * x1 + ... + betan * xn

# each p has a likelihood

# p = (e^logit(p)) / (1 + e^logit(p))

##################################################

library(rmr2)

# logistic regression with input parameters

# input = input dataset

# iterations = fixed number of iterations for

# calculing the gradient

# dims = dimensions of input variables

# alpha = the learning rate

logistic.regression =

function(input, iterations, dims, alpha){

49

Page 50: 07.RHadoop

Data Science con R

Regresión logística con Hadoop

# Compute the contribution of subset points

# to the gradient

lr.map =

function(., M) {

Y = M[,1]

X = M[,-1]

keyval(

1,

Y * X *

g(-Y * as.numeric(X %*% t(plane))))}

# A Big sum of all values of key 1

lr.reduce =

function(k, Z)

keyval(k, t(as.matrix(apply(Z,2,sum))))

50

Page 51: 07.RHadoop

Data Science con R

Regresión logística con Hadoop

## logistic.regression-main

plane = t(rep(0, dims))

g = function(z) 1/(1 + exp(-z))

for (i in 1:iterations) {

gradient =

values(

from.dfs(

mapreduce(

input,

map = lr.map,

reduce = lr.reduce,

combine = TRUE)))

plane = plane + alpha * gradient }

plane }

## end

51

Page 52: 07.RHadoop

Data Science con R

Regresión logística con Hadoop # Generate data and run

out = list()

test.size = 10^5

for (be in c("local", "hadoop")) {

rmr.options(backend = be)

## create test set

set.seed(0)

## logistic.regression-data

eps = rnorm(test.size)

testdata =

to.dfs(

as.matrix(

data.frame(

y = 2 * (eps > 0) - 1,

x1 = 1:test.size,

x2 = 1:test.size + eps)))

## end

52

Page 53: 07.RHadoop

Data Science con R

Ejecución

out[[be]] =

## logistic.regression-run

logistic.regression(

testdata, 3, 2, 0.05)

## end

## max likelihood solution diverges for separable

dataset, (-inf, inf) such as the above

}

stopifnot(

isTRUE(all.equal(out[['local']], out[['hadoop']],

tolerance = 1E-7)))

# write "out" to see results

53

Page 54: 07.RHadoop

Data Science con R

Clustering

Encontrar agrupaciones de objetos que sean similares o relacionados entre sí y diferentes o no relacionados con objetos de otras agrupaciones

54

Máxima distancia o diferencia entre clústeres distintos

Mínima distancia o diferencia

dentro del clúster

Page 55: 07.RHadoop

Data Science con R

Aplicaciones

55

Comprender • Agrupar información

relacionada entre sí como páginas web, genes, proteínas con funciones similares, o acciones con fluctuaciones de precios parecidas

Resumir • Reducir el tamaño de los

conjuntos de datos

Page 56: 07.RHadoop

Data Science con R

K-Means

56

Enfoque basado en divisiones Cada clúster está asociado a un centroide (punto central) Cada elemento es asignado a un clúster en función del centroid al que esté más cercano Debemos especificar previamente un número K de clúster El algoritmo básico es simple

Page 57: 07.RHadoop

Data Science con R

Ejemplos

57

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

0

0.5

1

1.5

2

2.5

3

x

y

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

0

0.5

1

1.5

2

2.5

3

x

y

Sub-optimal Clustering

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

0

0.5

1

1.5

2

2.5

3

x

y

Optimal Clustering

Original Points

Page 58: 07.RHadoop

Data Science con R

Clustering con R

# Loading iris flower dataset

data("iris")

# Generating clusters for iris dataset

kmeans <- kmeans(iris[, -5], 3, iter.max =

1000)

# Comparing iris Species with generated

cluster points

Comp <- table(iris[, 5], kmeans$cluster)

58

Page 59: 07.RHadoop

Data Science con R

Clustering con RHadoop

library(rmr2)

## @knitr kmeans-signature

kmeans.mr =

function(

P,

num.clusters,

num.iter,

combine,

in.memory.combine) {

## @knitr kmeans-dist.fun

dist.fun =

function(C, P) {

apply(

C,

1,

function(x)

colSums((t(P) - x)^2))}

59

Page 60: 07.RHadoop

Data Science con R

Explicación

Calculamos la distancia entre una matriz de “centros” C y una matriz de puntos P

60

Page 61: 07.RHadoop

Data Science con R

Mapper ## @knitr kmeans.map

kmeans.map =

function(., P) {

nearest = {

if(is.null(C))

sample(

1:num.clusters,

nrow(P),

replace = TRUE)

else {

D = dist.fun(C, P)

nearest = max.col(-D)}}

if(!(combine || in.memory.combine))

keyval(nearest, P)

else

keyval(nearest, cbind(1, P))}

61

Page 62: 07.RHadoop

Data Science con R

Explicación

El Mapper calcula las distancias entre los puntos y todos los centros, devolviendo para cada punto su centroide más cercano Los puntos se almacenan en HDFS Para ganar eficiencia, los centroides se almacenan en una matriz que está disponible para la función de mapeo En la primera iteración, se asigna aleatoriamente cada punto a un centroide En las siguientes se emplea el criterio de distancia mínima Se emite un vector (las posiciones son importantes)

62

Page 63: 07.RHadoop

Data Science con R

Clustering con RHadoop

Reducer: calcula media de los puntos que comparten un centro, esa será la clave

## @knitr kmeans.reduce

kmeans.reduce = {

if (!(combine || in.memory.combine) )

function(., P)

t(as.matrix(apply(P, 2, mean)))

else

function(k, P)

keyval(

k,

t(as.matrix(apply(P, 2, sum))))}

63

Page 64: 07.RHadoop

Data Science con R

Clustering con RHadoop

## @knitr kmeans-main-1

C = NULL

for(i in 1:num.iter ) {

C = values(from.dfs(mapreduce(P,

map = kmeans.map, reduce = kmeans.reduce)))

if(combine || in.memory.combine)

C = C[, -1]/C[, 1]

if(nrow(C) < num.clusters) {

C = rbind(C, matrix(rnorm((num.clusters –

nrow(C)) * nrow(C)),

ncol = nrow(C)) %*% C) }}

C}

64

Page 65: 07.RHadoop

Data Science con R

Explicación

El bucle principal manda a la memoria resultados y funciones necesarias Para devolver el valor final se implementa un proceso heurístico para conseguir el número de centroides deseado Ahora creamos unos datos “para jugar”

65

Page 66: 07.RHadoop

Data Science con R

Clustering con RHadoop

## @knitr kmeans-data

P = do.call(rbind, rep(list(matrix(

rnorm(10, sd = 10), ncol=2)), 20))

+ matrix(rnorm(200), ncol =2)

}

Crea una matriz de tamaño considerable, añadiendo algo de ruido, repitiendo alguna fila…

66

Page 67: 07.RHadoop

Data Science con R

La llamada principal

out[[be]] =

## @knitr kmeans-run

kmeans.mr(

to.dfs(P),

num.clusters = 12,

num.iter = 5,

combine = FALSE,

in.memory.combine = FALSE)

## @knitr end

}

67

Page 68: 07.RHadoop

Data Science con R

Resumen

RHadoop se presenta como otra buena opción para lanzar procesos MapReduce desde R RHadoop se compone de tres paquetes independientes: rmr2, rhdfs, rhbase La instalación se ha explicado con detalles Hemos visto como interacturar con HDFS a través de RHadoop También hemos realizado ejemplos varios de procesos MapReduce así como un ejemplo para trabajar con archivos csv Hemos reforzado nuestros conocimientos con un pequeño ejercicio Por último, hemos visto cómo ejecutar algunos algoritmos más elaborados con R y Hadoop

68