Páginas

Saturday, November 20, 2010

Leituras

Estou lendo:
  1. Practical Clojure (parei um pouco além da metade)
  2. On the cruelty of really teaching computing science (há um bom tempo pra começar, mas agora com PDF no celular fica mais fácil...)
  3. Crush it (obrigado @Israel!)
  4. On Lisp
  5. Land of Lisp (excelente)
  6. Structure and Interpretation of Computer Programs (leitura obrigatória... estou començando agora, depois de muito tempo que ficou na fila... mais uma vez, leitura no celular!)
  7. The Moon Is a Harsh Mistress (ainda pra começar... desisti de ouvir o audiobook)

Tem mais coisa que vai surgindo... mas esta foi a listinha que enviei num email outro dia :D

Criando uma conta no Twitter

Tem sido difícil tirar um tempinho para blogar. Estes dias estou lendo um livro que o Israel me emprestou, e finalmente de alguma forma me convenci a criar uma conta no Twitter. Não para ficar perdendo meu tempo falando onde estou, ou que a pizza chegou atrasada, ou que isso ou aquilo. O interesse é apenas "educacional", já que a plataforma é de fato interessante.

É claro, entrar no jogo nesta altura do campeonato não é nada fácil... Opções como "rhcarvalho" ou "rodolfocarvalho" já foram tomadas meses ou anos atrás. E já que iria ficar com um nome de usuário pouco significativo, resolvi que este nome deveria ser curto.

Foi fácil perceber que todos os nomes com apenas 1 caracter já existiam. Com exceção do "i", mas mesmo assim não consegui criar um conta com o nome de usuário "i".

Ontem acabei desistindo de criar a tal conta. E hoje, sábado, escrevi um pequeno script em python para verificar todos os nomes possíveis com 2 ou 3 letras que ainda estivessem disponíveis.

Descobri que nada seria possível com 2 letras, e existiam 3112 opções com 3 letras. Destas, 1 era composta apenas por dígitos, e 5 eram compostas apenas por letras.
As contas compostas apenas por letras eram: ['xjv', 'txp', 'dzz', 'qfw', 'hqc']
Destas, nenhuma me interessa...

Mas o número... o número com 3 dígitos é a minha nova conta no Twitter! @201

201 é um número bacana!

Quanto ao script, usei meu conhecimento adquirido com web crawling multithread para viabilizar um "ataque de força bruta" a API do Twitter usada na verificação de disponibilidades de nomes.

Saturday, October 16, 2010

Aprendizado de máquina

Curso da Faculdade de Engenharia de Standford sobre Aprendizado de Máquina:

http://see.stanford.edu/see/lecturelist.aspx?coll=348ca38a-3a6d-4052-937d-cb017338d7b1

É possível aprender com os dados?

Tudo começou com a leitura de um post num blog, sobre Online Learning [1], sugestão de um amigo do estágio.
Nos comentários tinha um link para um site com vídeo aulas [2].
Chegando lá, já no primeiro link no topo da página [3] me interessei e comecei a assistir uma aula de uma hora sobre aprendizado semi-supervisionado.

Existem métodos de inferir/formular modelos a partir de um conjunto de dados no qual temos como entrada pares de entrada+saída. São os chamados métodos supervisionados.
Por exemplo, podemos ter como entrada 1000 emails e saber se cada um deles é um spam ou não.

Seria interessante agora inferir coisas a partir dos dados não classificados, classificação não-supervisionada.
Este é o caso quando queremos por exemplo encontrar grupos através de uma função de similaridade.

O aprendizado semi-supervisionado é quando temos alguns dados classificados, e outros não classificados. Ou seja, temos 1000 emails que sabemos distinguir entre spam e não-spam, mais digamos 9000 emails que não sabemos a classificação.

Esses 9000 emails podem ajudar substancialmente a desenvolver um modelo que dado um novo email ele seja classificado corretamente como spam ou não-spam.
Na aula são mostradas duas categorias de problemas, e que tipo de conjunto de dados funcionam bem usando as técnicas apresentadas.
  • Expectation Maximization (EM) [4]
  • Co-training [5]
Essas técnicas me deram uma idéia de como posso classificar tweets como positivos ou negativos a respeito de algum candidato nas eleições 2010 [6], bastando ter algumas amostras de mensagens classificadas positivamente e outras classificadas negativamente.

Fica a sugestão a todos para visitar o videolectures.net e passar algumas horas assistindo a aulas muito interessantes.


[1] http://mark.reid.name/sap/online-learning-in-clojure.html
[2] http://videolectures.net
[3] http://videolectures.net/mlas06_mitchell_sla/
[4] http://en.wikipedia.org/wiki/Expectation-maximization_algorithm
[5] http://en.wikipedia.org/wiki/Co-training
[6] http://www.eleitorando.com.br

Friday, October 8, 2010

Dicionários recursivos

Só por curiosidade, alguém além de mim já fez isso aqui?

Digite no seu interpretador de Python:

d = dict()
d['d'] = d
d
d['d']
d['d']['d']
d = dict()
e = dict()
d['e'] = e
d
e['d'] = d
e
d
d['e']['e']
d['e']['d']



É bem interessante ver:
In [17]: d['e']['d']
Out[17]: {'e': {'d': <Recursion on dict with id=4321969824>}