inteligencia artificial y ruby on rails: mejora la publicidad de tu web
Post on 23-Jun-2015
6.265 Views
Preview:
DESCRIPTION
TRANSCRIPT
Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web
Santiago BelSergio Espeja
Inteligencia Artificial
• “La ciencia y la ingeniería de hacer las máquinas inteligentes", John McCarthy
• Algoritmos que resuelven problemas inteligentes
Usos de la IA
• Planificación de procesos• Diagnosticar problemas• Interpretación de escritura manual• Lenguaje natural• Reconocimiento del habla• Reconocimiento facial• ...
Métodos de IA• IA Convencional:
– Sistemas expertos, redes bayesianas, ...
• Clasificadores:– Redes neuronales, k-nearest neighbor algorithm,
clasificador naive bayes, árboles de decisión, ...
• Inteligencia computacional:– Sistemas de lógica difusa (fuzzy systems),
algoritmos genéticos, ...
Algoritmos genéticosaplicados a la
publicidad
¿y porqué algoritmos genéticos?• Alguien nos dió la idea…• Hay artículos muy buenos del sector del
marketing.– Not-So-Mad Science: Genetic Algorithms and Web
Page Design for Marketers, Matthew Syrett. (2005)
– http://www.marketingprofs.com/5/syrett6.asp?part=2
Algoritmos genéticos
• Basados en la teoría de Darwin
• Datos que evolucionan para encontrar de manera exacta o aproximada la solución óptima.
Photo by John Mu
http://www.flickr.com/people/jm123467890/
Definición académica• A genetic algorithm (GA) is a search technique
used in computing to find exact or approximate solutions to optimization and search problems. Genetic algorithms are categorized as global search heuristics. Genetic algorithms are a particular class of evolutionary algorithms (also known as evolutionary computation) that use techniques inspired by evolutionary biology such as inheritance, mutation, selection, and crossover (also called recombination).
Bla, bla, bla, …
Una definición más informal…
• http://www.youtube.com/watch?v=itgLHSZY6gE&feature=related
Aplicación del Algoritmo Genético
• Buscar la mejor combinación de banners que obtenga más clicks.
• Hacerlo automáticamente sin supervisión humana.
Darwin’s Evolution Theory…
• Hay una población (conjunto de individuos)
• Sólo los mejor adaptados sobreviven.
• Individuos se combinan entre ellos apareciendo nuevas generaciones
• La naturaleza provoca mutaciones, introduciendo así nuevas peculiaridades en la población
Requisitos del Algoritmo Genético
• Estructura de datos que representa al individuo.
¿cómo representamos las características de un individuo?
• Función de fitness:¿Cuándo un individuo es mejor que otro?¿Cómo calculamos que se adapta mejor?
• Función de recombinar¿Cómo creamos nuevas generaciones a partir de la
generación actual?
• Función de mutar¿Cómo introducimos nuevas peculiaridades en la
población?
Ruby y Algoritmos Genéticos
• Gga4r, General Genetic Algorithms for Ruby– http://gga4r.rubyforge.org/– Sergio Espeja & Santiago Bel, 2007
Instalar la libreríagem install gga4r
Representación del individuo• Cada combinación de anuncios candidata es un individuo en
nuestra población.• En nuestro ejemplo hay 4 slots para poner banners.
1 2 3 4
ad6 ad9 ad3 ad2
1
24 3
Objectivo:
Conseguir la mejor combinación
Persistencia en RoR
Representación del Individuo• Clase combinación. # id :integer# clicks :integer# impresiones_restantes :integer# mutaciones :integer# generaciones :integer# parejas :string #
NUM_POSICIONES = 4class Combinacion < ActiveRecord::Base has_many :posicion_anuncios serialize :parejas def click self.clicks += 1 self.update end def impresion self.impresiones_restantes -= 1 self.update endend
Guardamos las combinaciones en la relación posicion_anuncios
Controlamos los clicks y las impresiones de cada combinación.
Función de fitness
• http://www.metacafe.com/watch/29815/rock_monster/
Función de fitness
• En este caso una combinación de anuncios es mejor cuanto más elevado es su CTR (Click Through Ratio).
class Combinacion < ActiveRecord::Base
def fitness self.clicks.to_f/NUM_IMPRESIONES_COMBINACION.to_f end
end
Función recombine
• http://www.youtube.com/watch?v=VUZbk9KddR4&feature=related
Función recombine
• Se decide una posición al azar en el vector.• Entonces los dos vectores combinados se
mezclan dando 2 vectores de descendencia.
1 2 3 4 5
X ad9 ad3 X ad7
1 2 3 4 5
X ad9 ad3 ad4 ad5
1 2 3 4 5
ad1 ad2 ad3 ad4 ad5
1 2 3 4 5
ad1 ad2 ad3 X ad7
Padres Hijos
Función recombine (II)
def recombine(combinacion_2) cross_point = (rand * combinacion_2.posicion_anuncios.size-2).truncate+1 c1_a, c1_b = self.posicion_anuncios.separate(cross_point) c2_a, c2_b = combinacion_2.posicion_anuncios.separate(cross_point)
lista_1 = c1_a + c2_b lista_2 = c2_a + c1_b hijo_1 = Combinacion.new hijo_2 = Combinacion.new
NUM_POSICIONES.times do |pos| hijo_1.posicion_anuncios << PosicionAnuncio.create(:position => pos, :anuncio => lista_1[pos].anuncio) hijo_2.posicion_anuncios << PosicionAnuncio.create(:position => pos, :anuncio => lista_2[pos].anuncio) end hijo_1.save; hijo_2.save self.parejas ||= [] combinacion_2.parejas ||= [] self.parejas << combinacion_2.id combinacion_2.parejas << self.id self.update; combinacion_2.update return [hijo_1, hijo_2] end
Método Mutate
• Se escoge una posición aleatoria y se cambia su anuncio por otro al azar.
1 2 3 4 5
ad5 ad9 ad3 ad2 ad7
1 2 3 4 5
ad5 ad9 ad3 ad1 ad7
def mutate mutate_point = (rand * NUM_POSICIONES).truncate anuncios = Anuncio.find :all self.mutaciones += 1 self.posicion_anuncios[mutate_point].anuncio = anuncios[(anuncios.size*rand).truncate] self.save end
Inicialización y ejecución
• Crear población inicial (mayoritariamente se hace al azar)
• Crear el objeto GeneticAlgorithm con la población inicial
• Ejecutar: – Evolucionar y buscar los mejores individuos de la población.– Eliminar los que no obtengan buenos resultados.
Crear la población inicialapp/models/combinacion.rb
class Combinacion < ActiveRecord::Basedef self.create_random c = Combinacion.new c.impresiones_restantes = NUM_IMPRESIONES_COMBINACION anuncios = Anuncio.find :all NUM_POSICIONES.times do |pos| c.posicion_anuncios << PosicionAnuncio.create( :position => pos, :anuncio => anuncios[(anuncios.size*rand).truncate] ) end c.save return c endend
app/controllers/application.rb
@poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect do Combinacion.create_random
end
¿ Cómo evolucionan los
anuncios ?
Código de la evoluciónapp/controllers/application.rb
def escoge_combinacion @poblacion_actual = Combinacion.find :all # Si no existe ninguna combinación, creamos la población inicial @poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect { Combinacion.create_random } \
if @poblacion_actual.empty? # Se elige una combinación al azar @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first
# Si no quedan combinaciones por mostrar, la población actual evoluciona a una nueva generación if @combinacion.nil? @poblacion_actual.each {|c| c.generaciones +=1 } @ga = GeneticAlgorithm.new( @poblacion_actual, {:p_combination => 1.0,
:p_mutation => 0.1, :max_population => NUM_COMBINACIONES_GENERACION} )
@ga.evolve @extinguidos = @poblacion_actual - @ga.generations[-1] @extinguidos.each {|e| e.destroy} @poblacion_actual = @ga.generations[-1] @poblacion_actual.each do |c|
c.clicks = 0c.impresiones_restantes = NUM_IMPRESIONES_COMBINACIONc.update
end @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first end @combinacion.impresion end
¿Qué falta?
• Contar los clicksapp/controllers/application.rb
def cuenta_clicks @posicion_anuncio = PosicionAnuncio.find params[:id] @posicion_anuncio.combinacion.click redirect_to @posicion_anuncio.anuncio.urlend
Elegir la combinación en cada impresión
app/controllers/[controladores con vistas que muestren publicidad]
before_filter :escoge_combinacion, :except => "cuenta_clicks"
¿Y en las vistas?
app/helpers/application_helper.rb
def pinta_banner(posicion, orientacion) imagen_path = if orientacion.downcase == "h“
@combinacion.posicion_anuncios[posicion-1].anuncio.banner_h else
@combinacion.posicion_anuncios[posicion-1].anuncio.banner_v end link_to image_tag(imagen_path),
:action => "cuenta_clicks",:id => @combinacion.posicion_anuncios[posicion-1]
end
app/views/[vistas que muestren publicidad]
<%= pinta_banner 4, "h" %>
Simulación
• www.publievo.com• www.publievo.com/combinaciones
… o queréis más?
¿Preguntas …
Clasificador Naïve Bayes
• Aplica la regla de Bayes asumiendo variables independientes.
• Las clases deben ser conocidas
• Necesita entrenamiento
Photo by Aya Walraven Otakehttp://www.flickr.com/people/ayalan/
Ruby y los clasificadores Bayesianos
• Instalar la libreríagem install classifier
Ruby Classifier - Bayesian and LSI classification libraryhttp://classifier.rubyforge.org/Lucas Carlson, David Fayram II.
Ejemplo de Naïve Bayes:
• Servicio de atención al cliente de un servicio de hospedaje web.
• Dependiendo del asunto del email, enviar a:– Departamento Técnico– Departamento Comercial
• Necesitamos un grupo de entrenamiento con asuntos ya clasificados como “Técnico” o “Comercial”
Vamos a trabajar (I)
• Crear el clasificadorrequire 'rubygems'require 'stemmer'require 'classifier'
# Create the classifierclassifier = Classifier::Bayes.new('Technical', 'Commercial')
Grupos de entrenamiento (I)
• Grupo comercialcommercial = ["I already payed this invoice.","Do you have any discount for 1 year contract?","Do you have discounts?","Do you have any affiliate schema?","This is my new VISA no","I cannot see my invoices","When is finishing my free period?","I have a friend that is interested in your services, will you make us any offer?","I didn't use your services last mont. I shouldn't be charged","Do you have any kind of warranty?","Is it possible to freeze my account and continue after holidays?","I don't want to continue with your services.","Great service! Can I upgrade my account?","Where are the differences between shared and private hosting?"]
Grupos de entrenamiento (II)
• Grupo técnicotechnician = ["I have limit of quoata exceeded and I cannot see my mail.","Is your ftp server working correctly?","My mails get delayed too much when my php application sends them.","I cannot read my mail","I cannot connect to the ftp server.","I cannot upload to the ftp server","My rails application is not working in your server.","Can I use background processes in the shared hosting?","Can I install this gem?","My php app is not working","Can you setup a ssl cert for me please?","I cannot connect to my server.","How can I connect to subversion?"]
Vamos a trabajar (II)
• Entrenar el clasificador
# Train the classifiertechnician.each { |technician| classifier.train_Technical technician }commercial.each { |commercial| classifier.train_Commercial commercial }
Ya está listo!
• Listo para usar. ¿Magia?puts classifier.classify "How can I connect to my ftp account?“-> Technicalputs classifier.classify "Is a private account better?“-> Commercialputs classifier.classify "Do you have available rails framework?“-> Technicalputs classifier.classify "How much is your shared hosting for a whole year?"-> Commercialputs classifier.classify "I didn't get my discount in the last invoice. Is there something wrong?"-> Commercialputs classifier.classify "Connection Timeout in my ftp connections“-> Technicalputs classifier.classify "Which is my email outgoing server?“-> Technical
Conclusiones…• No hay que tener miedo de los algoritmos de
Inteligencia Artificial (al menos por ahora)• Pensadlo, pueden mejorar increíblemente
vuestras aplicaciones web con muy poca dedicación.
• Es muy fácil de usar.• Las aplicaciones de la IA son más que la
detección de SPAM.
¿Preguntas?
¡Gracias!
Código y más información en bee.com.es
top related