John Godoi - Bibliotecas Java para ciência de dados - #oowBR #JavaOneBR

Preview:

Citation preview

Java Libraries for Data Science

John Godoi@john_godoi

Here is John Godoi speaking

Bacharel em Ciência da Computação pelo ICT - UNIFESP - SJC

Mestrando em Ciência da Computação pelo ICT - UNIFESP - SJC

Here is John Godoi speaking

Bacharel em Ciência da Computação pelo ICT - UNIFESP - SJC

Mestrando em Ciência da Computação pelo ICT - UNIFESP - SJC

Pesquisador bolsista do Centro de Arqueologia e Antropologia Forense da

UNIFESP

http://www.lawrence.edu/academics/s

tudy/anthropology

Here is John Godoi speaking

Bacharel em Ciência da Computação pelo ICT - UNIFESP - SJC

Mestrando em Ciência da Computação pelo ICT - UNIFESP - SJC

Pesquisador bolsista do Centro de Arqueologia e Antropologia Forense da

UNIFESP

~ 5 anos como Desenvolvedor Java (Spring, Hibernate, Struts, Maven, …)

Here is John Godoi speaking

Bacharel em Ciência da Computação pelo ICT - UNIFESP - SJC

Mestrando em Ciência da Computação pelo ICT - UNIFESP - SJC

Pesquisador bolsista do Centro de Arqueologia e Antropologia Forense da

UNIFESP

~ 5 anos como Desenvolvedor Java (Spring, Hibernate, Struts, Maven, …)

Computação forense em multimídia

Processamento de Imagens

Aprendizado de Máquina

For Today’s Graduate, Just One Word: Statistics - NyTimes

“People think of field archaeology as Indiana Jones, but much of what you really do

is data analysis,” - Ms. Grimes - Google

“I keep saying that the sexy job in the next 10 years will be statisticians,” said Hal

Varian, chief economist at Google. “And I’m not kidding.

“But the big problem is going to be the ability of humans to use, analyze and make

sense of the data.” - an economist and director of the MIT’s Center for Digital

Business

http://www.nytimes.com/2009/08/06/technology/06stats.html

O que é Ciência dos Dados?

“Uma forma de definir ciência dos dados é como uma passo revolucionário da interdisciplinaridade de áreas

como:

Análise de negoócios que incorporam

Ciência da Computação,

Modelagem,

Estatísticas,

Análises,

e matemática.“

http://datascience.nyu.edu/what-is-data-science

As 3 fases da Ciência dos Dados

1. Organizar os dados

a localização física e

estrutura dos dados são planejadas

e executadas

http://www.datascientists.net/what-is-data-science

As 3 fases da Ciência dos Dados

1. Organizar os dados

a localização física e

estrutura dos dados são planejadas

e executadas

2. Empacotar os dados

Protótipos são criados,

as estatísticas são realizadas

e a visualização é criada.

http://www.datascientists.net/what-is-data-science

As 3 fases da Ciência dos Dados

1. Organizar os dados

a localização física e

estrutura dos dados são planejadas

e executadas

2. Empacotar os dados

Protótipos são criados,

as estatísticas são realizadas

e a visualização é criada.

3. Entregar os dados

A história é contada

http://www.datascientists.net/what-is-data-science

Organização

Conheça o domínio

1. O que são os dados?

O que representa cada registro?

Como esses dados foram obtidos ou devem ser obtidos?

Conheça o domínio

1. O que são os dados?

O que representa cada registro?

Como esses dados foram obtidos ou devem ser obtidos?

2. Qual a relação entre os dados?

Entre cada registro

Entre cada coluna (variável)

Conheça o domínio

1. O que são os dados?

O que representa cada registro?

Como esses dados foram obtidos ou devem ser obtidos?

2. Qual a relação entre os dados?

Entre cada registro

Entre cada coluna (variável)

3. O que você quer descobrir nos dados?

O que se espera entender a respeito dos dados?

Qual o valor esperado a ser obtido com a análise desses dados?

Tipos comuns de arquivos

Tipos comuns de arquivos

CSV

Arquivos em ASC, em que cada coluna é separada por vírgulas ,

Tipos comuns de arquivos

CSV private static final String [] FILE_HEADER_MAPPING = {AUTHORS, TITLE, YEAR, SOURCE};

public List<Article> loadArticlesFromCSV(String filename) {

ArrayList<Article> articles = Lists.newArrayList();

try {

FileReader reader = new FileReader(filename);

CSVFormat csvFileFormat = CSVFormat.DEFAULT.withHeader(FILE_HEADER_MAPPING);

CSVParser csvFileParser = new CSVParser(reader, csvFileFormat);

List<CSVRecord> csvRecords = csvFileParser.getRecords();

for (int i = 1; i < csvRecords.size(); i++) {

Article article = new Article();

CSVRecord csvRecord = csvRecords.get(i);

article.setCiteQuantity(csvRecord.get(AUTHORS));

//...

articles.add(article);

}

} catch (Exception e) {

e.printStackTrace();

}

return articles;

OpenCSV

Biblioteca Apache para leitura

de arquivos CSV

http://opencsv.sourceforge.net/

Tipos comuns de arquivos

DAT

Podem ser binários ou estarem em asc

É necessário conhecer como os dados estão organizados

Pode ser similar ao CSVDataInputStream input = new DataInputStream(new FileInputStream( "data.dat"));

while (input.available() > 0) {

int x = input.readInt();

System.out.println(x);

}

input.close();

http://stackoverflow.com/questions/23141851/reading-a-dat-file-into-an-array-in-java

Tipos comuns de arquivos

JSON

É composto por duas estruturas:

Uma coleção de pares de chaves/valores que representa um objeto.

Uma lista ordenada de valores.

http://www.json.org/

Tipos comuns de arquivos

JSON

É composto por duas estruturas:

Uma coleção de pares de chaves/valores que representa um objeto.

Uma lista ordenada de valores.

{"value1":1,"value2":"abc"}

https://github.com/google/gson

Tipos comuns de arquivos

JSON

É composto por duas estruturas:

Uma coleção de pares de chaves/valores que representa um objeto.

Uma lista ordenada de valores.

{"value1":1,"value2":"abc"}

class BagOfPrimitives {

private int value1 = 1;

private String value2 = "abc";

private transient int value3 = 3;

BagOfPrimitives() {

// no-args constructor

}

}

https://github.com/google/gson

Tipos comuns de arquivos

JSON

É composto por duas estruturas:

Uma coleção de pares de chaves/valores que representa um objeto.

Uma lista ordenada de valores.

{"value1":1,"value2":"abc"}

class BagOfPrimitives {

private int value1 = 1;

private String value2 = "abc";

private transient int value3 = 3;

BagOfPrimitives() {

// no-args constructor

}

}

BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);

https://github.com/google/gson

Tipos comuns de arquivos

XML

Arquivo, em asc, que usa estrutura baseada

em árvore (DOM) formada por tags <>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<customer id="100">

<age>29</age>

<name>mkyong</name>

</customer>

http://www.mkyong.com/java/jaxb-hello-world-example/

Tipos comuns de arquivos

XML

Arquivo, em asc, que usa estrutura baseada

em árvore (DOM) formada por tags <>

http://www.mkyong.com/java/jaxb-hello-world-example/

@XmlRootElement

public class Customer {

String name;

int age;

int id;

public String getName() {

return name;

}

@XmlElement

public void setName(String name) {

this.name = name;

}

//outros getters e setters

}

JAXB

API do JavaX para

manipulação de arquivos XML

Tipos comuns de arquivos

XML

Arquivo, em asc, que usa estrutura baseada

em árvore (DOM) formada por tags <>

http://www.mkyong.com/java/jaxb-hello-world-example/

File file = new File("C:\\file.xml");

JAXBContext jaxbContext =

JAXBContext.newInstance(Customer.class);

Unmarshaller jaxbUnmarshaller =

jaxbContext.createUnmarshaller();

Customer customer = (Customer)

jaxbUnmarshaller.unmarshal(file);

System.out.println(customer);

JAXB

API do JavaX para

manipulação de arquivos XML

Representação de Dados

Collections com tipos primitivos

Streams

Inseridas na Collection API do Java 8

Suporte a tipos primitivos sem a realização de autoboxing

Paralelização nativa do processamento dos dados

API Funcional

Collections com tipos primitivos

Streams

Inseridas na Collection API do Java 8

Suporte a tipos primitivos sem a realização de autoboxing

Paralelização nativa do processamento dos dados

API Funcional

public class StatisticalProcessor {

public static double calculateAverage(double ...values) {

return DoubleStream.of(values).average().getAsDouble();

}

//outras funções

public static double calculateVariance(double ...values) {

double average = calculateAverage(values);

return DoubleStream.of(values).map(p -> Math.pow((p - average),2)).sum()/values.length;

}

}

Collections com tipos primitivos

Opções para versões anteriores do Java

Joda-primitives

Provê uma implementação com suporte para primitivos de Collection, List e outros.

https://github.com/JodaOrg/joda-primitives/int[] a = new int[] {0, 6, 2};

ArrayIntList c = new ArrayIntList(a);

Collections com tipos primitivos

Opções para versões anteriores do Java

Joda-primitives

Provê uma implementação com suporte para primitivos de Collection, List e outros.

https://github.com/JodaOrg/joda-primitives/

Trove4J

Possui uma quantidade maior de implementações com suporte para primitivos

List

int[] a = new int[] {0, 6, 2};

ArrayIntList c = new ArrayIntList(a);

TDoubleDoubleMap N = new TDoubleDoubleHashMap();

double v = (N.containsKey(contourLabels[i][j]))?N.get(contourLabels[i][j]): 0.;

N.put(contourLabels[i][j], v+=1.);

N-Dimensions

Arrays em usam inteiros para acessar indíces de um vetor

Logo há um limite da quantidade de elementos que podem ser usados.

A API de Collections, antes de Streams, só lidava com reference objects como

elementos.

Consumo elevado de memória

ND4J

Criada para dar suporte para a biblioteca de aprendizado profundo, redes neurais

com aprendizado não supervisionado, Deeplearning4J.

Fornece uma API com:

Uma implementação versátil para vetor n-dimensional

Biblioteca com funções de álgebra linear e processamento de sinais

Funcionalidades multiplataformas e GPUs

http://nd4j.org/

ND4J

INDArray arr1 = Nd4j.create(new float[]{1,2,3,4},new int[]{2,2});

System.out.println(arr1);

// [[1,00, 2,00],

// [3,00, 4,00]]

http://nd4j.org/

ND4J

INDArray arr1 = Nd4j.create(new float[]{1,2,3,4},new int[]{2,2});

System.out.println(arr1);

// [[1,00, 2,00],

// [3,00, 4,00]]

arr1.addi(1);

System.out.println(arr1);

// [[2,00, 3,00],

// [4,00, 5,00]]

http://nd4j.org/

ND4J

INDArray arr1 = Nd4j.create(new float[]{1,2,3,4},new int[]{2,2});

System.out.println(arr1);

// [[1,00, 2,00],

// [3,00, 4,00]]

arr1.addi(1);

System.out.println(arr1);

// [[2,00, 3,00],

// [4,00, 5,00]]

INDArray arr2 = Nd4j.create(new float[]{5,6,7,8},new int[]{2,2});

arr1.addi(arr2);

System.out.println(arr1);

// [[ 7,00, 9,00],

// [11,00, 13,00]]

http://nd4j.org/

Grafos

Grafos são:

São estruturas de dados compostas por nós e arestas.

As arestas podem conter pesos conforme a necessidade do problema

Podem ser direcionais ou não.

https://en.wikipedia.org/wiki/Graph_theory

Grafos

Grafos são:

São estruturas de dados compostas por nós e arestas.

As arestas podem conter pesos conforme a necessidade do problema

Podem ser direcionais ou não.

Exemplos do que pode ser representado:

Redes sociais

Grafos

Grafos são:

São estruturas de dados compostas por nós e arestas.

As arestas podem conter pesos conforme a necessidade do problema

Podem ser direcionais ou não.

Exemplos do que pode ser representado:

Redes sociais

Internet http://www.nature.com/nature/journal/v406/n679

4/full/406353a0.html

Grafos

Grafos são:

São estruturas de dados compostas por nós e arestas.

As arestas podem conter pesos conforme a necessidade do problema

Podem ser direcionais ou não.

Exemplos do que pode ser representado:

Redes sociais

Internet

Linhas áreas

...

http://openflights.org/data.html

Grafos (JGraphT)

JGraphT é um biblioteca em Java que possui uma API com suporte as

representações de grafos e diversos métodos para a manipulação dessas

estruturas.DirectedGraph<URL, DefaultEdge> g = new DefaultDirectedGraph<>(DefaultEdge.class);

URL amazon = new URL("http://www.amazon.com");

URL yahoo = new URL("http://www.yahoo.com");

URL ebay = new URL("http://www.ebay.com");

// add the vertices

g.addVertex(amazon);

g.addVertex(yahoo);

g.addVertex(ebay);

// add edges to create linking structure

g.addEdge(yahoo, amazon);

g.addEdge(yahoo, ebay);

System.out.println(hrefGraph.toString());

Grafos (JGraphT)

JGraphT é um biblioteca em Java que possui uma API com suporte as

representações de grafos e diversos métodos para a manipulação dessas

estruturas.DirectedGraph<URL, DefaultEdge> g = new DefaultDirectedGraph<>(DefaultEdge.class);

URL amazon = new URL("http://www.amazon.com");

URL yahoo = new URL("http://www.yahoo.com");

URL ebay = new URL("http://www.ebay.com");

// add the vertices

g.addVertex(amazon);

g.addVertex(yahoo);

g.addVertex(ebay);

// add edges to create linking structure

g.addEdge(yahoo, amazon);

g.addEdge(yahoo, ebay);

System.out.println(hrefGraph.toString());

([http://www.amazon.com, http://www.yahoo.com, http://www.ebay.com],

[(http://www.yahoo.com,http://www.amazon.com),

(http://www.yahoo.com,http://www.ebay.com)])

Pré-processamento

Adequação dos dados

Tratar dados faltantes

Valor padrão

Substituir por valor padrão

Adequação dos dados

Tratar dados faltantes

Valor padrão

Substituir por valor padrão

Remover colunas (variáveis) irrelevantes

Economizar memória

Simplificar manipulação dos dados

Adequação dos dados

Tratar dados faltantes

Valor padrão

Substituir por valor padrão

Remover colunas (variáveis) irrelevantes

Economizar memória

Simplificar manipulação dos dados

Tratar dados nominativos

Classes

Substituir por várias colunas

Processamento

Manipulações estatísticas

Alguns métodos estatísticos nos descrevem sobre a organização dos dados.

Média - em torno de qual valor os dados estão variando. É calculada somando todos os elementos e

então dividindo o resultados pela quantidade de elementos

DoubleStream.of(values).sum()/values.length;

Manipulações estatísticas

Alguns métodos estatísticos nos descrevem sobre a organização dos dados.

Média - em torno de qual valor os dados estão variando. É calculada somando todos os elementos e

então dividindo o resultados pela quantidade de elementos

Variância - quão distantes os valores estão da média. É calculada somando a diferença entre cada valor

para a média e elevada ao quadrado.

DoubleStream.of(values).sum()/values.length;

DoubleStream.of(values).map(p -> Math.pow((p - average),2)).sum()/values.length;

Manipulações estatísticas

Alguns métodos estatísticos nos descrevem sobre a organização dos dados.

Média - em torno de qual valor os dados estão variando. É calculada somando todos os elementos e

então dividindo o resultados pela quantidade de elementos

Variância - quão distantes os valores estão da média. É calculada somando a diferença entre cada valor

para a média e elevada ao quadrado.

Desvio Padrão - quão distantes os valores estão da média. É a raiz da variância.

DoubleStream.of(values).sum()/values.length;

DoubleStream.of(values).map(p -> Math.pow((p - average),2)).sum()/values.length;

Math.sqrt(calculateVariance(values));

Manipulações estatísticas

http://www.uh.edu/engines/epi1939.htm

Manipulações estatísticas

http://www.statisticshowto.com/bell-curve/

ND4J

INDArray mulArray = arr1.mul(arr2);

System.out.println(mulArray);

// [[ 35,00, 54,00],

// [ 77,00, 104,00]]

assertEquals("Media da matriz",10.,arr1.meanNumber());

assertEquals("Variância da matriz",6.66666,arr1.varNumber());

assertEquals("Desvio padrão da matriz",2.58199,arr1.stdNumber().doubleValue());

http://nd4j.org/

Aprendizado de Máquina

Tarefas comuns de aprendizado de máquina

Classificação

Os dados são divididos em classes ou grupos ou tipos pré-definidos

http://openclassroom.stanford.edu/MainFolder

/CoursePage.php?course=MachineLearning

Tarefas comuns de aprendizado de máquina

Clusterização

Os dados são divididos em grupos nos quais cada integrante possui características comuns

http://docs.opencv.org/

Tarefas comuns de aprendizado de máquina

Predição (regressão)

Definir uma função ou método que dado algumas informações do registro possa descobrir qual o

valor de alguma outra variável do registro

https://azure.microsoft.com/en-

us/documentation/articles/machine-learning-

algorithm-choice/

Classificação por 1 vizinho mais próximo

Se tivermos dois registros previamente classificados em classes diferentes.

Terrestre

Marinho

Classificação por 1 vizinho mais próximo

Para cada registro do conjunto de dados poderíamos compará-los com os registros pré-classificados.

Terrestre

Marinho

?

Classificação por 1 vizinho mais próximo

E os que forem similares copiar a classe de uma para o outro.

Terrestre

Terrestre

Weka

É uma biblioteca com diversas implementações em Java para métodos de aprendizado de máquina e

mineração de dados. Disponibiliza tanto uma interface para o uso dessas ferramentas quanto uma API para

integração com código Java.

Possui ferramentas que dão suporte a:

Pré-processamento

Classificação

Regressão

Clusterização

Visualização

http://www.cs.waikato.ac.nz/ml/weka/

Entrega

Visualizando os Dados

JavaFX possui sua própria API para a criação de gráficos.

https://docs.oracle.com/javafx/2/charts/jfxpub-charts.htm

Java Libraries for Data Science

John Godoi@john_godoi

Referências

1. Java 8 Prático - Casa do

Código - Paulo Silveira e

Rodrigo Turini

2. Inteligência Artificial - gen LTC -

Katti Faceli, Ana Carolina Lorna,

João Gama e André C. P. L. F.

de Carvalho

3. Machine Learning for Hackers -

O’Reilly - Drew Conway e John

Myles White

4. Data Mining - Morgan

Kaufmann - Ian H. Witten, Eibe

Frank e Mark A. Hall

Códigos https://github.com/johngodoi

/JavaDataScience

Recommended