Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    2 Favorites

    Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web - Presentation Transcript

    1. Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web Santiago Bel Sergio Espeja
    2. Inteligencia Artificial
      • “ La ciencia y la ingeniería de hacer las máquinas inteligentes ", John McCarthy
      • Algoritmos que resuelven problemas inteligentes
    3. Usos de la IA
      • Planificación de procesos
      • Diagnosticar problemas
      • Interpretación de escritura manual
      • Lenguaje natural
      • Reconocimiento del habla
      • Reconocimiento facial
      • ...
    4. 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, ...
    5. Algoritmos genéticos aplicados a la publicidad
    6. ¿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
    7. 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 /
    8. 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, …
    9. Una definición más informal…
      • http://www.youtube.com/watch?v=itgLHSZY6gE&feature=related
    10. 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.
    11. 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
    12. 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?
    13. Ruby y Algoritmos Genéticos
      • Gga4r, General Genetic Algorithms for Ruby
        • http://gga4r.rubyforge.org/
        • Sergio Espeja & Santiago Bel, 2007
      • Instalar la librería
      gem install gga4r
    14. 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 4 3
      • Objectivo:
      • Conseguir la mejor combinación
      1 2 3 4 ad6 ad9 ad3 ad2
    15. Persistencia en RoR
    16. Representación del Individuo
      • Clase combinación.
      # id :integer # clicks :integer # impresiones_restantes :integer # mutaciones :integer # generaciones :integer # parejas :string # NUM_POSICIONES = 4 class 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 end end
      • Guardamos las combinaciones en la relación posicion_anuncios
      • Controlamos los clicks y las impresiones de cada combinación.
    17. Función de fitness
      • http://www.metacafe.com/watch/29815/rock_monster/
    18. 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
    19. Función recombine
      • http://www.youtube.com/watch?v=VUZbk9KddR4&feature=related
    20. 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.
      Padres Hijos 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
    21. 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
    22. Método Mutate
      • Se escoge una posición aleatoria y se cambia su anuncio por otro al azar.
      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 1 2 3 4 5 ad5 ad9 ad3 ad2 ad7 1 2 3 4 5 ad5 ad9 ad3 ad1 ad7
    23. 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.
    24. Crear la población inicial app/models/combinacion.rb class Combinacion < ActiveRecord::Base def 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 end end app/controllers/application.rb @poblacion_actual = Array.new(NUM_COMBINACIONES_GENERACION).collect do Combinacion.create_random end
    25. ¿ Cómo evolucionan los anuncios ?
    26. Código de la evolución app/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 = 0 c.impresiones_restantes = NUM_IMPRESIONES_COMBINACION c.update end @combinacion = @poblacion_actual.select {|c| c.impresiones_restantes > 0}.shuffle!.first end @combinacion.impresion end
    27. ¿Qué falta?
      • Contar los clicks
      app/controllers/application.rb def cuenta_clicks @posicion_anuncio = PosicionAnuncio.find params[:id] @posicion_anuncio.combinacion.click redirect_to @posicion_anuncio.anuncio.url end
      • Elegir la combinación en cada impresión
      app/controllers/[controladores con vistas que muestren publicidad] before_filter :escoge_combinacion, :except => &quot;cuenta_clicks&quot;
    28. ¿Y en las vistas? app/helpers/application_helper.rb def pinta_banner(posicion, orientacion) imagen_path = if orientacion.downcase == &quot;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 => &quot;cuenta_clicks&quot;, :id => @combinacion.posicion_anuncios[posicion-1] end app/views/[vistas que muestren publicidad] <%= pinta_banner 4, &quot;h&quot; %>
    29. Simulación
      • www.publievo.com
      • www.publievo.com/combinaciones
    30. … o queréis más? ¿Preguntas …
    31. Clasificador Naïve Bayes
      • Aplica la regla de Bayes asumiendo variables independientes.
      • Las clases deben ser conocidas
      • Necesita entrenamiento
      Photo by Aya Walraven Otake http://www.flickr.com/people/ayalan/
    32. Ruby y los clasificadores Bayesianos
      • Instalar la librería
      gem install classifier
      • Ruby Classifier - Bayesian and LSI classification library
        • http://classifier.rubyforge.org/
        • Lucas Carlson , David Fayram II .
    33. 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”
    34. Vamos a trabajar (I)
      • Crear el clasificador
      require 'rubygems' require 'stemmer' require 'classifier' # Create the classifier classifier = Classifier::Bayes.new('Technical', 'Commercial')
    35. Grupos de entrenamiento (I)
      • Grupo comercial
      commercial = [&quot;I already payed this invoice.&quot;, &quot;Do you have any discount for 1 year contract?&quot;, &quot;Do you have discounts?&quot;, &quot;Do you have any affiliate schema?&quot;, &quot;This is my new VISA no&quot;, &quot;I cannot see my invoices&quot;, &quot;When is finishing my free period?&quot;, &quot;I have a friend that is interested in your services, will you make us any offer?&quot;, &quot;I didn't use your services last mont. I shouldn't be charged&quot;, &quot;Do you have any kind of warranty?&quot;, &quot;Is it possible to freeze my account and continue after holidays?&quot;, &quot;I don't want to continue with your services.&quot;, &quot;Great service! Can I upgrade my account?&quot;, &quot;Where are the differences between shared and private hosting?&quot;]
    36. Grupos de entrenamiento (II)
      • Grupo técnico
      technician = [&quot;I have limit of quoata exceeded and I cannot see my mail.&quot;, &quot;Is your ftp server working correctly?&quot;, &quot;My mails get delayed too much when my php application sends them.&quot;, &quot;I cannot read my mail&quot;, &quot;I cannot connect to the ftp server.&quot;, &quot;I cannot upload to the ftp server&quot;, &quot;My rails application is not working in your server.&quot;, &quot;Can I use background processes in the shared hosting?&quot;, &quot;Can I install this gem?&quot;, &quot;My php app is not working&quot;, &quot;Can you setup a ssl cert for me please?&quot;, &quot;I cannot connect to my server.&quot;, &quot;How can I connect to subversion?&quot;]
    37. Vamos a trabajar (II)
      • Entrenar el clasificador
      # Train the classifier technician.each { |technician| classifier.train_Technical technician } commercial.each { |commercial| classifier.train_Commercial commercial }
    38. Ya está listo!
      • Listo para usar. ¿Magia?
      puts classifier.classify &quot;How can I connect to my ftp account?“ -> Technical puts classifier.classify &quot;Is a private account better?“ -> Commercial puts classifier.classify &quot;Do you have available rails framework?“ -> Technical puts classifier.classify &quot;How much is your shared hosting for a whole year?&quot; -> Commercial puts classifier.classify &quot;I didn't get my discount in the last invoice. Is there something wrong?&quot; -> Commercial puts classifier.classify &quot;Connection Timeout in my ftp connections“ -> Technical puts classifier.classify &quot;Which is my email outgoing server?“ -> Technical
    39. 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.
    40. ¿Preguntas?
    41. ¡Gracias! Código y más información en bee.com.es

    spejmanspejman, 2 years ago

    custom

    3561 views, 2 favs, 1 embeds more stats

    Inteligencia Artificial en ruby on rails para optim more

    More Info

    © All Rights Reserved

    Go to text version
    • Total Views 3561
      • 3547 on SlideShare
      • 14 from embeds
    • Comments 0
    • Favorites 2
    • Downloads 85
    Most viewed embeds
    • 14 views on http://knowdler.lacoctelera.net

    more

    All embeds
    • 14 views on http://knowdler.lacoctelera.net

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as innappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel

    Categories