Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web Santiago Bel Sergio Espeja
Inteligencia Artificial <ul><li>“ La ciencia y la ingeniería de hacer las máquinas inteligentes &quot;, John McCarthy </li...
Usos de la IA <ul><li>Planificación de procesos </li></ul><ul><li>Diagnosticar problemas </li></ul><ul><li>Interpretación ...
Métodos de IA <ul><li>IA Convencional: </li></ul><ul><ul><li>Sistemas expertos, redes bayesianas, ... </li></ul></ul><ul><...
Algoritmos genéticos aplicados a la publicidad
¿y porqué algoritmos genéticos? <ul><li>Alguien nos dió la idea… </li></ul><ul><li>Hay artículos muy buenos del sector del...
Algoritmos genéticos <ul><li>Basados en la teoría de Darwin </li></ul><ul><li>Datos que evolucionan para encontrar de mane...
Definición académica <ul><li>A  genetic algorithm (GA)  is a  search   technique  used in  computing  to find exact or  ap...
Una definición más informal… <ul><li>http://www.youtube.com/watch?v=itgLHSZY6gE&feature=related </li></ul>
Aplicación del Algoritmo Genético <ul><li>Buscar la mejor combinación de banners que obtenga más clicks. </li></ul><ul><li...
Darwin’s Evolution Theory… <ul><li>Hay una población (conjunto de individuos) </li></ul><ul><li>Sólo los mejor adaptados s...
Requisitos del Algoritmo Genético <ul><li>Estructura de datos que representa al individuo. </li></ul><ul><li>¿cómo represe...
Ruby y Algoritmos Genéticos <ul><li>Gga4r, General Genetic Algorithms for Ruby </li></ul><ul><ul><li>http://gga4r.rubyforg...
Representación del individuo <ul><li>Cada combinación de anuncios candidata es un individuo en nuestra población. </li></u...
Persistencia en RoR
Representación del Individuo <ul><li>Clase combinación.  </li></ul>#  id  :integer #  clicks  :integer #  impresiones_rest...
Función de fitness <ul><li>http://www.metacafe.com/watch/29815/rock_monster/ </li></ul>
Función de fitness <ul><li>En este caso una combinación de anuncios es mejor cuanto más elevado es su CTR (Click Through R...
Función recombine <ul><li>http://www.youtube.com/watch?v=VUZbk9KddR4&feature=related </li></ul>
Función recombine <ul><li>Se decide una  posición al azar  en el vector. </li></ul><ul><li>Entonces los dos vectores combi...
Función recombine (II) def recombine(combinacion_2) cross_point = (rand * combinacion_2.posicion_anuncios.size-2).truncate...
Método Mutate <ul><li>Se escoge una posición aleatoria y se cambia su anuncio por otro al azar. </li></ul>def mutate mutat...
Inicialización y ejecución <ul><li>Crear población inicial (mayoritariamente se hace al azar) </li></ul><ul><li>Crear el o...
Crear la población inicial app/models/combinacion.rb class Combinacion < ActiveRecord::Base def self.create_random c = Com...
¿ Cómo evolucionan los anuncios ?
Código de la evolución app/controllers/application.rb def escoge_combinacion @poblacion_actual = Combinacion.find :all # S...
¿Qué falta? <ul><li>Contar los clicks </li></ul>app/controllers/application.rb def cuenta_clicks @posicion_anuncio = Posic...
¿Y en las vistas? app/helpers/application_helper.rb def pinta_banner(posicion, orientacion) imagen_path = if orientacion.d...
Simulación <ul><li>www.publievo.com </li></ul><ul><li>www.publievo.com/combinaciones </li></ul>
…  o queréis más? ¿Preguntas …
Clasificador Naïve Bayes <ul><li>Aplica la regla de Bayes asumiendo variables independientes. </li></ul><ul><li>Las clases...
Ruby y los clasificadores Bayesianos <ul><li>Instalar la librería </li></ul>gem install classifier <ul><li>Ruby Classifier...
Ejemplo de Naïve Bayes: <ul><li>Servicio de atención al cliente de un servicio de hospedaje web. </li></ul><ul><li>Dependi...
Vamos a trabajar (I) <ul><li>Crear el clasificador </li></ul>require 'rubygems' require 'stemmer' require 'classifier' # C...
Grupos de entrenamiento (I) <ul><li>Grupo comercial </li></ul>commercial =  [&quot;I already payed this invoice.&quot;, &q...
Grupos de entrenamiento (II) <ul><li>Grupo técnico </li></ul>technician =  [&quot;I have limit of quoata exceeded and I ca...
Vamos a trabajar (II) <ul><li>Entrenar el clasificador </li></ul># Train the classifier technician.each { |technician| cla...
Ya está listo! <ul><li>Listo para usar. ¿Magia? </li></ul>puts classifier.classify &quot;How can I connect to my ftp accou...
Conclusiones… <ul><li>No hay que tener miedo de los algoritmos de Inteligencia Artificial (al menos por ahora) </li></ul><...
¿Preguntas?
¡Gracias! Código y más información en  bee.com.es
Upcoming SlideShare
Loading in …5
×

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

7,578 views

Published on

Inteligencia Artificial en ruby on rails para optimizar automáticamente la publicidad de una aplicación.

Published in: Technology
  • Be the first to comment

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

  1. 1. Inteligencia Artificial y Ruby on Rails: Mejora la publicidad de tu web Santiago Bel Sergio Espeja
  2. 2. Inteligencia Artificial <ul><li>“ La ciencia y la ingeniería de hacer las máquinas inteligentes &quot;, John McCarthy </li></ul><ul><li>Algoritmos que resuelven problemas inteligentes </li></ul>
  3. 3. Usos de la IA <ul><li>Planificación de procesos </li></ul><ul><li>Diagnosticar problemas </li></ul><ul><li>Interpretación de escritura manual </li></ul><ul><li>Lenguaje natural </li></ul><ul><li>Reconocimiento del habla </li></ul><ul><li>Reconocimiento facial </li></ul><ul><li>... </li></ul>
  4. 4. Métodos de IA <ul><li>IA Convencional: </li></ul><ul><ul><li>Sistemas expertos, redes bayesianas, ... </li></ul></ul><ul><li>Clasificadores: </li></ul><ul><ul><li>Redes neuronales, k-nearest neighbor algorithm, clasificador naive bayes, árboles de decisión, ... </li></ul></ul><ul><li>Inteligencia computacional: </li></ul><ul><ul><li>Sistemas de lógica difusa (fuzzy systems), algoritmos genéticos, ... </li></ul></ul>
  5. 5. Algoritmos genéticos aplicados a la publicidad
  6. 6. ¿y porqué algoritmos genéticos? <ul><li>Alguien nos dió la idea… </li></ul><ul><li>Hay artículos muy buenos del sector del marketing. </li></ul><ul><ul><li>Not-So-Mad Science: Genetic Algorithms and Web Page Design for Marketers , Matthew Syrett. (2005) </li></ul></ul><ul><ul><li>http://www.marketingprofs.com/5/syrett6.asp?part=2 </li></ul></ul>
  7. 7. Algoritmos genéticos <ul><li>Basados en la teoría de Darwin </li></ul><ul><li>Datos que evolucionan para encontrar de manera exacta o aproximada la solución óptima. </li></ul>Photo by John Mu http://www.flickr.com/people/ jm123467890 /
  8. 8. Definición académica <ul><li>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 ). </li></ul><ul><li>Bla, bla, bla, … </li></ul>
  9. 9. Una definición más informal… <ul><li>http://www.youtube.com/watch?v=itgLHSZY6gE&feature=related </li></ul>
  10. 10. Aplicación del Algoritmo Genético <ul><li>Buscar la mejor combinación de banners que obtenga más clicks. </li></ul><ul><li>Hacerlo automáticamente sin supervisión humana. </li></ul>
  11. 11. Darwin’s Evolution Theory… <ul><li>Hay una población (conjunto de individuos) </li></ul><ul><li>Sólo los mejor adaptados sobreviven. </li></ul><ul><li>Individuos se combinan entre ellos apareciendo nuevas generaciones </li></ul><ul><li>La naturaleza provoca mutaciones, introduciendo así nuevas peculiaridades en la población </li></ul>
  12. 12. Requisitos del Algoritmo Genético <ul><li>Estructura de datos que representa al individuo. </li></ul><ul><li>¿cómo representamos las características de un individuo? </li></ul><ul><li>Función de fitness: </li></ul><ul><li>¿Cuándo un individuo es mejor que otro? </li></ul><ul><li>¿Cómo calculamos que se adapta mejor? </li></ul><ul><li>Función de recombinar </li></ul><ul><li>¿Cómo creamos nuevas generaciones a partir de la generación actual? </li></ul><ul><li>Función de mutar </li></ul><ul><li>¿Cómo introducimos nuevas peculiaridades en la población? </li></ul>
  13. 13. Ruby y Algoritmos Genéticos <ul><li>Gga4r, General Genetic Algorithms for Ruby </li></ul><ul><ul><li>http://gga4r.rubyforge.org/ </li></ul></ul><ul><ul><li>Sergio Espeja & Santiago Bel, 2007 </li></ul></ul><ul><li>Instalar la librería </li></ul>gem install gga4r
  14. 14. Representación del individuo <ul><li>Cada combinación de anuncios candidata es un individuo en nuestra población. </li></ul><ul><li>En nuestro ejemplo hay 4 slots para poner banners. </li></ul>1 2 4 3 <ul><li>Objectivo: </li></ul><ul><li>Conseguir la mejor combinación </li></ul>1 2 3 4 ad6 ad9 ad3 ad2
  15. 15. Persistencia en RoR
  16. 16. Representación del Individuo <ul><li>Clase combinación. </li></ul># 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 <ul><li>Guardamos las combinaciones en la relación posicion_anuncios </li></ul><ul><li>Controlamos los clicks y las impresiones de cada combinación. </li></ul>
  17. 17. Función de fitness <ul><li>http://www.metacafe.com/watch/29815/rock_monster/ </li></ul>
  18. 18. Función de fitness <ul><li>En este caso una combinación de anuncios es mejor cuanto más elevado es su CTR (Click Through Ratio). </li></ul>class Combinacion < ActiveRecord::Base def fitness self.clicks.to_f/NUM_IMPRESIONES_COMBINACION.to_f end end
  19. 19. Función recombine <ul><li>http://www.youtube.com/watch?v=VUZbk9KddR4&feature=related </li></ul>
  20. 20. Función recombine <ul><li>Se decide una posición al azar en el vector. </li></ul><ul><li>Entonces los dos vectores combinados se mezclan dando 2 vectores de descendencia. </li></ul>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. 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. 22. Método Mutate <ul><li>Se escoge una posición aleatoria y se cambia su anuncio por otro al azar. </li></ul>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. 23. Inicialización y ejecución <ul><li>Crear población inicial (mayoritariamente se hace al azar) </li></ul><ul><li>Crear el objeto GeneticAlgorithm con la población inicial </li></ul><ul><li>Ejecutar: </li></ul><ul><ul><li>Evolucionar y buscar los mejores individuos de la población. </li></ul></ul><ul><ul><li>Eliminar los que no obtengan buenos resultados. </li></ul></ul>
  24. 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. 25. ¿ Cómo evolucionan los anuncios ?
  26. 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. 27. ¿Qué falta? <ul><li>Contar los clicks </li></ul>app/controllers/application.rb def cuenta_clicks @posicion_anuncio = PosicionAnuncio.find params[:id] @posicion_anuncio.combinacion.click redirect_to @posicion_anuncio.anuncio.url end <ul><li>Elegir la combinación en cada impresión </li></ul>app/controllers/[controladores con vistas que muestren publicidad] before_filter :escoge_combinacion, :except => &quot;cuenta_clicks&quot;
  28. 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. 29. Simulación <ul><li>www.publievo.com </li></ul><ul><li>www.publievo.com/combinaciones </li></ul>
  30. 30. … o queréis más? ¿Preguntas …
  31. 31. Clasificador Naïve Bayes <ul><li>Aplica la regla de Bayes asumiendo variables independientes. </li></ul><ul><li>Las clases deben ser conocidas </li></ul><ul><li>Necesita entrenamiento </li></ul>Photo by Aya Walraven Otake http://www.flickr.com/people/ayalan/
  32. 32. Ruby y los clasificadores Bayesianos <ul><li>Instalar la librería </li></ul>gem install classifier <ul><li>Ruby Classifier - Bayesian and LSI classification library </li></ul><ul><ul><li>http://classifier.rubyforge.org/ </li></ul></ul><ul><ul><li>Lucas Carlson , David Fayram II . </li></ul></ul>
  33. 33. Ejemplo de Naïve Bayes: <ul><li>Servicio de atención al cliente de un servicio de hospedaje web. </li></ul><ul><li>Dependiendo del asunto del email, enviar a: </li></ul><ul><ul><li>Departamento Técnico </li></ul></ul><ul><ul><li>Departamento Comercial </li></ul></ul><ul><li>Necesitamos un grupo de entrenamiento con asuntos ya clasificados como “Técnico” o “Comercial” </li></ul>
  34. 34. Vamos a trabajar (I) <ul><li>Crear el clasificador </li></ul>require 'rubygems' require 'stemmer' require 'classifier' # Create the classifier classifier = Classifier::Bayes.new('Technical', 'Commercial')
  35. 35. Grupos de entrenamiento (I) <ul><li>Grupo comercial </li></ul>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. 36. Grupos de entrenamiento (II) <ul><li>Grupo técnico </li></ul>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. 37. Vamos a trabajar (II) <ul><li>Entrenar el clasificador </li></ul># Train the classifier technician.each { |technician| classifier.train_Technical technician } commercial.each { |commercial| classifier.train_Commercial commercial }
  38. 38. Ya está listo! <ul><li>Listo para usar. ¿Magia? </li></ul>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. 39. Conclusiones… <ul><li>No hay que tener miedo de los algoritmos de Inteligencia Artificial (al menos por ahora) </li></ul><ul><li>Pensadlo, pueden mejorar increíblemente vuestras aplicaciones web con muy poca dedicación. </li></ul><ul><li>Es muy fácil de usar. </li></ul><ul><li>Las aplicaciones de la IA son más que la detección de SPAM. </li></ul>
  40. 40. ¿Preguntas?
  41. 41. ¡Gracias! Código y más información en bee.com.es

×