Busca

Road trippin' w ma 2 fav allies

Estruturas de dados em R

Fonte: http://curso-r.github.io/posts/aula02.html

Os tipos básicos são atomic vector (homogêneo e unidimensional), matriz (homogêneo e bidimensional), array (homogêneo e multidimensional), lista (heterogêneo) e dataframe (heterogêneo).

 

Atomic Vectors

São as estruturas mais simples. São como arrays unidimensionais de int ou Strings em Java. Os tipos possíveis são: lógico (booleano), integer, double, complexo ou character. Exemplos:

dbl_var <- c(1, 2.5, 4.5) #DOUBLE

int_var <- c(1L, 6L, 10L) #sufixo L especifica inteiros em vez de double

log_var <- c(TRUE, FALSE, T, F) #T e F também servem

chr_var <- c("essas são", "algumas strings")

Curiosidade: c() vem de concatenate

Pra saber o tipo do objeto, usamos a função typeof(var). Outras funções: is.integer(var), is.double(var), isnumeric(var) #serve para inteiro e double, is.logical(var), is.character(var).

Coerção: quando dois objetos de tipos diferentes são inseridos em uma estrutura homogênea, o R converterá o objeto para o tipo mais flexível, na ordem: logical, integer, double, character. Ex: c(“a”,1) #o 1 vira character; c(T,1) #o T vira integer.

Factors: utilizados para armazenar dados categorizados. Contém valores pré-definidos (levels), e se baseam em um vetor de inteiros. Ex: f <- factor(c(“aventura”,”terror”,”comédia”,”drama”)). Observe que dentro do objeto os levels são organizados em ordem alfabética. Obs: factors não são convertíveis em números.

 

Matrizes e Arrays

Definidos usando as funções matrix() e array().

mat <- matrix(1:6, ncol = 3, nrow = 2)

arr <- array(1:12, c(3,2,2))  #1 a 12 são os dados pra preencher o array, e o array terá 3 linhas, 2 colunas, “2 dimensões”

Funções úteis: length() #para vetores, dim() #para dimensões do array ou matriz, nrow() e ncol() #para matriz ou array

 

Listas e Data frames

Listas: definidas através da função list(). Ex.: list(c(1:5),c(“homem”, “mulher”),c(T, F, T),list(c(1,2,3), c(“a”, “b”, “c”)))

Data frames: listas em que todos os elementos têm o mesmo comprimento. Definidos através da função data.frame(). Ex.: df <- data.frame(x = 1:4, y = c(“oi”, “oi”, “oi”, “oi”), z = T) #o T é replicado nas 4 posições; Em um data frame, os caracteres são convertidos em factors. Se não deseja a conversão, use stringAsFactors = F. A função names() exibe os nomes das colunas.

Combinando data frames:

  • rbind(df1,df2) #as linhas de df2 são adicionadas ao fim de df1, num novo objeto, pois df1 não é modificado
  • cbind(df1,df2) #as colunas de df2 são adicionadas à direita de df1, num novo objeto, sem modificar os já existentes; perceba que se um objeto é menor que outro, a reciclagem acontecerá, como explicado na aula 01

 

Subsetting

Se trata de selecionar um subconjunto de um objeto no R.

  • Subsetting com nºs inteiros positivos. Ex.: x <- c(13, 8, 5, 3, 2, 1, 1), x[c(1,2,3)] #seleciona os três primeiros elementos do vetor
  • Subsetting com nºs inteiros negativos. Ex.:x <- c(13, 8, 5, 3, 2, 1, 1), x[-c(2,5,6)] #remove os índices especificados, retornando 13, 5, 3, 1
  • Subsetting com vetores lógicos. Ex.: x <- c(13, 8, 5, 3, 2, 1, 1),   x[x==1] #retorna 1, 1

Quando o objeto tem mais de uma dimensão, utilizamos a “,” para selecionar valores dentro de cada dimensão. Ex.: m <- matrix(c(1:5, 11:15), nrow=5, ncol=2)

Também é possível alterar valores usando subsetting. Ex.: x <- c(13, 8, 5, 3, 2, 1, 1), x[x>5] <- 0

 

Funcionais

Funções que recebem funções como parâmetro. Úteis para aplicar funções a pedaços de dados que estamos trabalhando. No R, são particularmente úteis por conta da vetorização.

Ex.: lista <- as.list(1:10), f_complexa <- function(x) { return(c(x, x^2)) }, lapply(lista, f_complexa) #aplica a função f_complexa em todos os elementos da lista ou vetor

 

Leitura de dados

Para lermos um BD, usamos a função read.table(). Ex.: dados <- read.table(file = “assets/dados/arq.txt”, sep = “;”) , str(dados)

 

Estatística básica

summary(dados), mean(dados), median(dados), quantile(dados), sd(dados), table(dados$cor) #calcula tablea de frequências

 

O operador pipe %>%

Torna o código mais legível. Particularmente útil para quando há muitas funções aninhadas.

Ex.: library(magrittr), x <- c(1,2,3,4,5), x %>% sum %>% sqrt #este código envia o objeto x como argumento da função sum(), e depois o resultado dessa soma para a função sqrt() (perceba que não é necessário colocar os parênteses das funções

O pipe substitui exatamente o primeiro argumento. Se não quiser substituir o primeiro argumento, utilize um “.” para especificar qual argumento deve ser substituído. Ex.: T %>% mean(c(NA, rnorm(100)), na.rm = .) # o ponto é substituido pelo lado esquerdo

 

Outras funções: str(var) (exibe a estrutura do objeto), order(var) (retorna os índices em ordem crescente)

Anúncios

Começando no R

Meus rabiscos ao iniciar o curso de R disponível em: http://curso-r.github.io/index.html (basicamente copiei para fixar melhor as ideias, eliminando algumas poucas coisas que julguei desnecessário)

 

Aula 01 – Noções Básicas

Working directory: getwd(), setwd(); paths: apenas \\ ou /

Pacotes: install.packages(“pacote”), library(pacote) (sem áspas)

Valores especiais: inf/-inf (divisão por zero, ou valores da ordem de 10^308), NaN (not a number, operações do tipo 0/0 e log(-1))

Operadores aritméticos menos óbvios: 2^3 ou 2**3 (exponenciação), 4%%2 (resto da divisão), 5%/%2 (resto inteiro da divisão)

Alguns operadores lógicos: x==b (igualdade, cuidade com as imprecisões do double!), x|y (ou), x&y (e), xor(x,y) (retorna TRUE se apenas um for verdadeiro); além de TRUE e FALSE, o R também aceita 1 e 0, especificamente, diferente de zero como TRUE e zero como FALSE

Stringspaste(“Eduardo”, “Falcao”, sep = ” “) (concatenação)

Condicionais: a sintaxe do if-else é a mesma da sintaxe da LP java, porém, o else ou “else if” devem vir na mesma linha da última chave, “}”, correspondente ao if anterior; também existe o ifelse para comparar todos os elementos de vetores (sem precisar fazer um for)

For:  for(iterador in  <sequencia>){}; também pode iterar num vetor, itens <-c(“item1”, “item2”, “item3”), for(item in itens){}; ou for(i in seq_along(itens)){print(itens[i])}. O uso do for é ineficiente. Geralmente, utiliza-se outras funções.

While: sintaxe semelhante à do Java; cont <- 0, while(runif(1)>0.5){ cont <- cont + 1 }

Reciclagem: x <- c(1,5), y<-c(1,10,100,1000), x+y, é igual a [2, 15, 101, 1005] (os valores do vetor menor é reciclado até preencher o vetor maior)

Funções: nome_da_funcao <- function(<parâmetros>) { #faz coisa com os parâmetros, resultado }; nome_da_funcao(param1, param2, …); Funções também são objetos! Aliás, tudo que você atribui com <- vira um objeto no R. Assim, é natural pensar que funções podem receber outras funções como argumento e isso é bem comum.

Parâmetros opcionais: se um parâmetro já tem atribuído a ele um valor na definição da função, ele é um parâmetro opcional, i.e., se você não especificar um valor, aquele o valor definido na função será usado

Parâmetros relativos: parâmetros cujo valor padrão usa o valor de outro parâmetro; histograma <- function(numeros, xlab = “x”, titulo = paste(“Histograma de”, xlab)) {hist(numeros, xlab = xlab, main = titulo)}

Ordem ou nome: se você chamar a função apenas com valores, a ordem dos argumentos será utilizada para determinar qual valor será de qual argumento, se você chamar a função atribuindo os valores aos nomes na assinatura da função, a ordem não servirá de muita coisa

Parâmetro “…”: um número variável de outros parâmetros que geralmente são repassados para outras funções

Funções anônimas: não é definida permanentemente; Ex:

  1. nums <- 1:10
  2. eh_par <- sapply(nums, function(numero) {numero %% 2 == 0})
  3. cbind(nums, eh_par)

 

Variáveis aleatórias: 

  1. dnorm(x, mean = 0, sd = 1, log = FALSE)
  2. pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
  3. qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
  4. rnorm(n, mean = 0, sd = 1)

Repare nas 4 letras que antecedem norm nos nomes das funções. Essas letras significam:

  • d (“density”) Densidade da Normal, ou f.d.p da Normal;
  • p (“probability”) Função de distribuição acumulada (f.d.a) da Normal;
  • q (“quantile”) Quantil da Normal;
  • r (“random”) Gera um número vindo de uma Normal.

No lugar de norm, você pode trocar por outra distribuição de probabilidade. A tabela abaixo lista algumas das possibilidades:

Distribuição Apelido
Normal norm
Uniforme unif
Beta beta
Chi Quadrado chisq
Exponencial exp
F de Snedecor f
Gama gamma
Poisson pois

 

Outras funções:

runif(1): retorna um número aleatório entre 0 e 1, o argumento indica a quantidade de números a serem gerados

rnorm(n = 1000, mean = 1.80, sd = 0.1): retorna 1000 valores retirados de uma distribuição normal, com média 1.8 e desvio padrão 0.1

system.time(comando): mede o tempo para executar o comando especificado

identical(vetor1, vetor2): verifica se os dois vetores são iguais

args(nomeDaFunção): exibe os argumentos dessa função

 

Alguns atalhos do Eclipse

Facilitam e muito a minha vida 😛

RV e Ensino

Pra liberar espaço no meu dropbox comecei a vasculhar meu arquivos e apagar algumas coisas antigas. De repente, me deparo com dois vídeos de um projeto que havia feito no 3º período do meu curso, enquanto cursava a disciplina de Computação Gráfica e pesquisava no LabTEVE (temas relacionados a Realidade Virtual). #nostalgia

Trata-se do LabSEF: Laboratório para Simulação de Experimentos Físicos. (dava pra ser mais criativo com esse nome :P)

Enfim… sempre gostei de física, daí aproveitei a disciplina pra fazer uma navegação em um mundo virtual 3D de modo que o estudante pudesse simular alguns experimentos. Ah.. também dava pra navegar no ambiente com estereoscopia (aka visão 3D).

Paper: Um Laboratório Virtual Tridimensional e Interativo para Suporte ao Ensino de Física

 

P, NP, NP-hard and NP-Complete

O link mais didático que achei na internet sobre isso: https://www.quora.com/What-are-P-NP-NP-complete-and-NP-hard

Algumas outras fontes interessantes: 1 – http://stackoverflow.com/questions/1857244/what-are-the-differences-between-np-np-complete-and-np-hard; 2 – https://en.wikipedia.org/wiki/P_versus_NP_problem#Harder_problems

[]’s

Altruísmo recíproco e Reciprocidade indireta

Paper aceito no “1st Workshop on Edge Computing”WEC’16 acontecerá em Nara, a antiga capital do Japão, em conjunto com o IEEE ICDCS 2016.

Neste artigo propomos um novo tipo de reciprocidade indireta entre os peers: a reciprocidade transitiva.

De maneira geral, podemos categorizar as decisões para interações entre os peers de uma comunidade como sendo baseadas em reciprocidade direta ou reciprocidade indireta. Assim como em sistemas P2P, baseamos nossas decisões do mundo real em acontecimentos que observamos que nos atingem de maneira direta ou indireta.

reciprocidade direta acontece quando dois indivíduos decidem se ajudar baseados em interações acontecidas entre eles. Ex: hoje eu estou prestando um favor a Pedro porque Pedro me ajudou ontem.

No nosso cotidiano isso é bastante comum. Uma situação clássica de reciprocidade direta que me veio a mente é a de “quem vai/deve lavar a louça?” :-). Atualmente divido apartamento com meu pai em Campina Grande e eventualmente eu lavo a louça pra ele (quando ele está cansado do trabalho) e ele me retribui esse favor quando o mesmo me acontece. A verdade é que eu deveria lavar a louça pelo simples fato de ele ser meu pai (com certeza ele diria isso.. hehehe), mas o principal motivo de lhes prestar esse favor é pelo simples fato de eu saber que ele fará o mesmo por mim num futuro próximo (baseado nos acontecimentos passados).

 

reciprocidade indireta, também conhecida por reciprocidade generalizada, acontece quando um indivíduo A ajuda um indivíduo B sem que B tenha ajudado A anteriormente. Em suma, A ajuda B baseado em algum fator externo.

A reciprocidade indireta baseada em reputação já foi alvo de extensas investigações no meio acadêmico, principalmente no contexto de sistemas P2P de larga escala como o compartilhamento de arquivos via torrent. Nesta abordagem, eu ajudaria Pedro porque João me falou anteriormente que Pedro é um cara legal, ou até mesmo pelo simples fato de eu já ter visto Pedro ajudando uma terceira pessoa. Logo, eu concluo que se eu ajudar Pedro, ele pode me retribuir esse favor mais adiante, embora ninguém possa me garantir que isso vai acontecer.

Uma outra abordagem seria a reciprocidade indireta baseada na corrente do bem. É bem provável que você já tenha assistido aquele filme “A corrente do bem” que o ator principal é aquele molequinho que vê gente morta em todo lugar.

A ideia é bem simples. Se alguém me prestar um favor eu devo passar esse favor adiante e assim propagar o bem. A expectativa é que esse favor me seja retribuído por uma pessoa diferente daquela que foi beneficiada por mim. Logo, se eu passar esse favor adiante, esse favor pode ser retribuído a mim posteriormente, embora ninguém possa me garantir que isso vai acontecer.

 

Chamamos a nova abordagem que estamos propondo de reciprocidade indireta baseada em transitividade. A ideia é que os favores sejam transitivos, como explicado a seguir.  Imagine a seguinte situação, João doa 10 unidades de favor para Pedro, Pedro doa 10 unidades de favor para mim. Nesse caso, o débito de Pedro com João é 10, e o meu débito com Pedro também é 10.

O que acontece se João me pede 10 unidades de favores:

  1. eu doo para João e atualizo o débito dele comigo para 10?
  2. eu não doo para João porque ele nunca me doou anteriormente?
  3. eu doo para João utilizando o “crédito transitivo” que existe entre eu, Pedro e João? (resp. correta seguindo a transitividade indireta)

Se Pedro deve 10 a João, e eu devo 10 a Pedro, a ideia é que quando eu prestar 10 unidades de  favor a João eu diga a João que o estou fazendo em nome de Pedro, assim João irá zerar o débito de Pedro. Eu preciso também avisar a Pedro que fiz um favor a João em seu nome, assim Pedro zera o débito que eu tenho com ele, e Pedro saberá que não deve mais a João.

Com isso, o sistema fica economicamente mais estável. Os débitos tendem a ser atenuados via transitividade e isto torna as pessoas/peers mais propensas a colaborar entre si. Essa abordagem pode ter efeitos significativos em comunidades razoavelmente pequenas e também quando existe na comunidade assimetria de interesses ou de estados. O primeiro ocorre quando clusters de peers não interagem entre si pois os produtos intercambeados não lhes interessam. O segundo acontece quando os estados de consumidor e provedor entre os diferentes peers não ocorrem em um mesmo momento, inviabilizando a cooperação.

Detalhes sobre o protocolo utilizado para evitar trapaças e resultados proporcionados pela reciprocidade transitiva são expostos no paper. Assim que sair a versão final eu disponibilizo aqui.

 

Title – Enhancing P2P Cooperation through Transitive Indirect Reciprocity

Abstract—The main objective of this paper is to introduce and show some results concerning a novel form of indirect reciprocity, called transitive reciprocity, extending an incentive mechanism for cooperation in P2P systems based exclusively on direct reciprocity, called the Network of Favors. We define transitive indirect reciprocity and show with the aid of simulation experiments its usefulness in certain scenarios where its absence might lead to a system collapse. Transitive reciprocity is thought for small and medium size networks, and for scenarios where repeated interaction among peers is more likely. In contrast to other forms of indirect reciprocity, it does not involve any issues of trust, resting exclusively on first hand knowledge acquired by each peer through direct interaction with other peers. The new mechanism will be implemented in Fogbow, a middleware that uses the Network of Favors to support the fair barter of virtualized computing resources in a federation of private Infrastructure-as-a-Service cloud providers.

Index Terms—direct and indirect reciprocity; incentive mechanisms; fairness; reciprocal altruism

 

 

Paper accepted – WCGA 2015 (SBRC)

XIII Workshop em Clouds e Aplicações (WCGA2015)

Vitória, ES, 18 a 22 de maio de 2015
Evento do Simpósio Brasileiro de Redes de Computadores (SBRC 2015)

Paper que descreve alguns resultados iniciais da pesquisa que desenvolvo em meu doutorado. Basicamente, nesse paper nós mostramos que ao regular a oferta de recursos em um sistema P2P, um peer pode obter melhores níveis de justiça na comunidade em que ele participa. Título – Controlando a Contenção de Recursos para Promover Justiça em uma Federação Peer-to-Peer de Nuvens Privadas Resumo. Provedores privados de computação na nuvem poderiam obter considerável benefício mútuo ao operar suas infraestruturas de forma federada. Tal operação permite que a demanda excedente durante picos de demanda em um provedor possa ser atendida por outros provedores que estejam experimentando uma baixa demanda naquele mesmo instante. Neste trabalho, propomos a utilização de um mercado descentralizado baseado em escambo para o compartilhamento de recursos entre os participantes de uma federação de provedores de computação na nuvem. Utilizamos a noção da Rede de Favores, concebida anteriormente como um mecanismo de incentivo à colaboração no contexto de grades computacionais P2P oportunistas, e propomos uma extensão para promover justiça em federações P2P de nuvens privadas. O resultado é um mecanismo, baseado na Teoria do Controle Retroalimentado, que utiliza a justiça para regular a quantidade de recursos ofertados e que garante aos participantes colaborativos níveis adequados de justiça e satisfação, consequentemente segregando os caronas — indivíduos que apenas consomem recursos da rede.

http://sbrc2015.ufes.br/?page_id=547

Fomos premiados como o melhor artigo do WCGA 2015. 😀

Premiação WCGA 2015

Paper accepted – DAIS 2015

Position paper que descreve as ideias e alguns resultados preliminares para promover justiça para participantes colaborativos em um ambiente de federação P2P de nuvens privadas. Basicamente, descreve os resultados iniciais do meu trabalho de doutorado.

Title: Incentivising Resource Sharing in Federated Clouds
Abstract: An important cloud federation enabler is the development of suitable business models, which has so far received relatively little attention from investigators. Few efforts have been dedicated to investigation of business models for enabling cloud federations, especially with regard to distribution issues, in which centralized solutions are usually preferred. Hence, in our work we focus on the use of fully decentralized mechanisms supporting federation of private clouds based on barter mechanisms. We analyze the adaptation of fully decentralized incentive mechanisms previously used in the context of P2P desktop grids, and show that they are not suitable for federated cloud systems because fairness cannot always be guaranteed. We show initial results concerning the use of a mechanism intended to guarantee a higher level of fairness and thereby to promote voluntary participation in a decentralized federation without any central or trusted enforcing authority.

Accessibility as a Service: Augmenting Multimedia Content with Sign Language Video Tracks

Paper aceito em junho de 2012, finalmente publicado! 🙂

http://www.acs.org.au/information-resources/journal-library/jrpit/jrpit

http://www.acs.org.au/__data/assets/pdf_file/0020/51392/JRPIT45.2.79.pdf

Crie um website ou blog gratuito no WordPress.com.

Acima ↑