Post on 12-Apr-2017
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