Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Crear histogramas con MapReduce

Este ejemplo muestra cómo visualizar patrones en un conjunto de datos de gran tamaño sin tener que cargar todas las observaciones en la memoria simultáneamente. Muestra cómo calcular resúmenes de menor volumen de los datos que son suficientes para generar un gráfico.

Los histogramas son una técnica de visualización común que proporcionan una estimación empírica de la función de densidad de probabilidad (pdf) de una variable. Los histogramas se adaptan bien a un entorno de macrodatos, ya que pueden reducir el tamaño de los datos de entrada sin procesar a un vector de recuentos. Cada recuento es el número de observaciones que se encuentra dentro de cada uno de un conjunto de intervalos o bins contiguos, numéricos.

La función calcula recuentos por separado en varios fragmentos de los datos.mapreduce A continuación, suma los recuentos de todos los fragmentos.mapreduce La función de mapa y la función de reducción son muy simples en este ejemplo. Sin embargo, puede crear visualizaciones flexibles con la información de resumen que recopilan.

Preparar datos

Cree un almacén de datos utilizando el conjunto de información.airlinesmall.csv Este conjunto de datos de 12 megabyte contiene 29 columnas de información de vuelo para varias aerolíneas, incluidas las horas de llegada y salida. En este ejemplo, seleccione (retardo de llegada de vuelo) como variable de interés.ArrDelay

ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA'); ds.SelectedVariableNames = 'ArrDelay';

El almacén de datos trata los valores como ausentes y reemplaza los valores que faltan por valores predeterminados.'NA'NaN Además, la propiedad le permite trabajar solo con la variable de interés seleccionada, que puede verificar utilizando.SelectedVariableNamespreview

preview(ds)
ans=8×1 table
    ArrDelay
    ________

        8   
        8   
       21   
       13   
        4   
       59   
        3   
       11   

Ejecute MapReduce

La función requiere una función de mapa y una función de reducción como entradas.mapreduce El asignador recibe fragmentos de datos y genera resultados intermedios. El reductor Lee los resultados intermedios y produce un resultado final.

En este ejemplo, el asignador recopila los recuentos de vuelos con varias cantidades de retraso de llegada acumulando los retrasos de llegada en contenedores. Las ubicaciones se definen mediante el cuarto argumento de entrada para la función Map,.edges

Mostrar el archivo de función de mapa.

type visualizationMapper.m
function visualizationMapper(data, ~, intermKVStore, edges) % Count how many flights have arrival delay in each interval specified by % the EDGES vector, and add these counts to INTERMKVSTORE. counts = histc( data.ArrDelay, edges ); add( intermKVStore, 'Null', counts ); end 

El tamaño de bin del histograma es importante. Los bins que son demasiado anchos pueden oscurecer detalles importantes en el conjunto de datos. Los bins que son demasiado estrechos pueden conducir a un histograma ruidoso. Cuando se trabaja con conjuntos de datos muy grandes, es mejor evitar hacer varias pasadas sobre los datos para probar diferentes anchos de bin. Una forma sencilla de evitar realizar varias pasadas es recopilar recuentos con bins estrechos. A continuación, para obtener bins más anchos, puede Agregar recuentos de ubicaciones adyacentes sin volver a procesar los datos sin procesar. Los retrasos de llegada de los vuelos se notifican en incrementos de 1 minuto, por lo que se definen bins de 1 minuto de-60 minutos a 599 minutos.

edges = -60:599;

Cree una función anónima para configurar la función Map para que utilice los bordes de la ubicación. La función anónima le permite especializarse en la función de mapa especificando un valor particular para su cuarto argumento de entrada. A continuación, puede llamar a la función de mapa a través de la función anónima, utilizando sólo los tres argumentos de entrada que la función espera.mapreduce

ourVisualizationMapper = ...     @(data, info, intermKVstore) visualizationMapper(data, info, intermKVstore, edges);

Visualice el archivo de función de reducción. El reductor suma los recuentos almacenados por el asignador.

type visualizationReducer.m
function visualizationReducer(~, intermValList, outKVStore) % get all intermediate results from the intermediate store if hasnext(intermValList)     outVal = getnext(intermValList); else     outVal = []; end  while hasnext(intermValList)     outVal = outVal + getnext(intermValList); end      add(outKVStore, 'Null', outVal); end 

Se utiliza para aplicar el mapa y reducir las funciones al almacén de datos,.mapreduceds

result = mapreduce(ds, ourVisualizationMapper, @visualizationReducer);
******************************** *      MAPREDUCE PROGRESS      * ******************************** Map   0% Reduce   0% Map  16% Reduce   0% Map  32% Reduce   0% Map  48% Reduce   0% Map  65% Reduce   0% Map  81% Reduce   0% Map  97% Reduce   0% Map 100% Reduce   0% Map 100% Reduce 100% 

Devuelve un almacén de datos de salida, con archivos en la carpeta actual.mapreduceresult

Organizar resultados

Lea los resultados finales de recuento de bin del almacén de datos de salida.

r = readall(result); counts = r.Value{1};

Visualizar resultados

Trace los recuentos de bin sin procesar utilizando todo el rango de los datos (aparte de algunos valores atípicos excluidos por el asignador).

bar(edges, counts, 'hist'); title('Distribution of Flight Delay') xlabel('Arrival Delay (min)') ylabel('Flight Counts')

El histograma tiene colas largas. Mire un rango de ubicación restringido para visualizar mejor la distribución del retardo de la mayoría de los vuelos. Acercar un poco revela que hay un artefacto de reporte; es común que los retrasos redondos a incrementos de 5 minutos.

xlim([-50,50]); grid on grid minor

Suaviza los recuentos con un filtro de media móvil para eliminar el artefacto de grabación de 5 minutos.

smoothCounts = filter( (1/5)*ones(1,5), 1, counts); figure bar(edges, smoothCounts, 'hist') xlim([-50,50]); title('Distribution of Flight Delay') xlabel('Arrival Delay (min)') ylabel('Flight Counts') grid on grid minor

Para darle al gráfico un mejor equilibrio, no muestre el 1% superior de los vuelos más retrasados. Puede adaptar la visualización de muchas maneras sin volver a procesar el conjunto de datos completo, suponiendo que recopiló la información adecuada durante el paso completo a través de los datos.

empiricalCDF = cumsum(counts); empiricalCDF = empiricalCDF / empiricalCDF(end); quartile99 = find(empiricalCDF>0.99, 1, 'first'); low99 = 1:quartile99;  figure empiricalPDF = smoothCounts(low99) / sum(smoothCounts); bar(edges(low99), empiricalPDF, 'hist');  xlim([-60,edges(quartile99)]); ylim([0, max(empiricalPDF)*1.05]); title('Distribution of Flight Delay') xlabel('Arrival Delay (min)') ylabel('Probability Density')

Consulte también

|

Temas relacionados