Mes: agosto 2009

  • inteligencia artificial en la práctica

    ¿Qué tienen en común la ineligencia arificial, la semántica y la publicidad? En principio parece que muy poco, son términos que estamos acostumbrados a verlos por separado. Sin embargo como explican en el blog de google adsense la semántica y la publicidad están relacionadas. Y aunque no lo menciona, el análisis de textos para la comprensión semántica es un problema de la inteligencia artificial.

    Se puede decir que actualmente es lo suficientemente buena para que la pubicidad contextual funcione, pero no es todo lo buena que podría ser. De forma elegante en esa entrada comentan que la definición de relevancia difiere de a definición humana. ¿Existe una definición de relevancia no humana? Creo que no, el problema es que la relevancia humana es dificil de modelar y por eso los resultados difieren.

    En cualquier caso se trata de un problema complejo que está siendo resuelto con técnicas propias de la inteligencia artificial y que es relevante porque una empresa tecnológica como google depende de que su tecnología esté a la vanguardia.


  • el 1% de las veces funciona

    Paradojas de la estadística:

    No sé si llegará al 1%, pero si consigo acertar con el futuro de alguien, estará convencido de que mi experimento es capaz de adivinar el futuro. Y si consigues acertar 2 veces (1 cada 10.000) todavia más convencido. Y sin embargo con los millones de usuarios que hay en internet lo dificil sería no acertar con nadie.

  • novedades en chrome

    Según leo en maestros del web, chrome incorporará servicios de sincronización de bookmarks. Un servicio que anteriormente ofrecía Google para Firefox a través de un plugin, pero que finalmente abandonó. En su momento yo usaba éste servicio y me pareció un error su abandono, pero ahora se puede entender mejor. En arstechnica explican que la diferencia de éste servicio de Google para Chrome con otros servicios similares cómo mozilla weave, es que funcionará a través de un protocolo push, curiosamente basado en XMPP el mismo que usa Jabber o gtalk, lo que hará que consuma menos recursos y sea más rápido notificando cambios.

    Parece una buena solución técnica: protocolos abiertos, código fuente abierto, etc. Se reservarán el código fuente del servidor, pero por lo menos es posible que otros navegadores implementen las misma funcionalidad a través de plugins.

    Y puede que sea el principio de la integración de servicios online con el sistema operativo, recordemos que Chrome OS está en desarrollo, por lo que incorporará éste cambio y los que vengan a continuación.

  • ruby sbn

    El segundo elemento que tengo pensado utilizar en mi nuevo proyecto se trata de sbn una librería ruby que permite trabajar con redes bayesianas. Aunque la inferencia está limitada a un algoritmo de resolución aproximado, el Markov Chain Monte Carlo, por lo poco que he probado, esta librería es suficiente para mi proyecto, aunque me gustaría que tuviese algún método de inferencia exacto para poder comparar.

    Voy a poner un código sencillo y de paso comento algún detalle de este proyecto sin nombre. Me he decidido a implementar un «adivino del futuro» que funciona de forma aleatoria. La idea es generar un mensaje de texto aleatorio que contiene una serie de variables aleatorias: suerte, amor, salud, riqueza. Hasta ahora he construido una red bayesiana que determina la relación entre estas variables y otras derivadas, para que el mensaje sea coherente (aunque sea aleatorio). Por ejemplo, en el caso del trabajo, si eres afortunado en la riqueza, es posible que que también tengas suerte en el trabajo, pero entonces puede que tu familia te eche de menos y no seas tan afortunado en el amor.

    Por ahora he construido una red bayesiana que determina la relación entre una serie de parámetros. La red estará generada «a mano» para que los mensajes que se generen sean divertidos y más o menos coherentes. La descripción de los valores que maneja la red es esta:

    • suerte: es el factor principal de la red, el resto de variables dependen directa o indirectamente de la suerte.
    • amor: todos sabemos lo que es el amor. Por ahora el único hijo del amor es la familia, que depende directamente de nuestra suerte en el amor.
    • salud: fácil de saber qué significa. La salud determina nuestro trabajo, si no tenemos buena salud no podemos trabajar y viceversa.
    • riqueza: determina cúanto dinero y posesiones tenemos. Una parte de la riqueza depende del trabajo y otra del dinero (cómo algo genérico). He supuesto que si te va bien en la riqueza, lo más probable es que te vaya bien en el trabajo o en el dinero (juegos de azar, bolsa, etc) pero es improbable que te vayan bien o mal las dos cosas a la vez (aunque no es imposible).
    • trabajo: depende de la riqueza y de la salud.
    • familia: la más compleja de las variables de este ejemplo, depende del amor y del trabajo, que a su vez depende de la riqueza y de la salud. La idea es que si tenemos mucho trabajo, nuestra familia se resentirá, aunque le vaya bien a nuestra riqueza.

    Se trata de un ejemplo muy sencillo, en el que hay que tener en cuenta que no hablo de causalidad, sino de correlación estadística, pero al fín y al cabo es lo que cuenta para «predecir el futuro» y para darle coherencia al mensaje. Una vez generado el mensaje de «suerte», el siguiente paso es vestirlo con palabras que expresen correlación o causalidad indistitamente. Éste es básicamente el truco que usan los adivinos: te va bien en el trabajo, entonces tu familia no estará muy contenta, veo tu futuro muy negro, no vas a tener suerte, pero en el amor te va a ir bien, porque tu familia te va a apoyar. Lo complicado será generar estas palabras que expresen la relación causal, espero que wordnet me sirva de ayuda.

    El código ruby es muy sencillo y prácticamente se trata del ejemplo de uso de sbn adaptado a este caso:

    require ‘rubygems’
    require ‘sbn’

    #puts «Starting: #{Time.now}»

    net = Sbn::Net.new(«Predicting your future»)

    #main variable
    luck = Sbn::Variable.new(net, :luck, [0.5, 0.5])

    #base variables
    love = Sbn::Variable.new(net, :love)
    luck.add_child(love)
    love.set_probability(0.55, {:love => :true, :luck => :true})
    love.set_probability(0.45, {:love => :false, :luck => :true})
    love.set_probability(0.45, {:love => :true, :luck => :false})
    love.set_probability(0.55, {:love => :false, :luck => :false})

    health = Sbn::Variable.new(net, :health)
    luck.add_child(health)
    health.set_probability(0.55, {:health => :true, :luck => :true})
    health.set_probability(0.45, {:health => :false, :luck => :true})
    health.set_probability(0.45, {:health => :true, :luck => :false})
    health.set_probability(0.55, {:health => :false, :luck => :false})

    wealth = Sbn::Variable.new(net, :wealth)
    luck.add_child(wealth)
    wealth.set_probability(0.55, {:wealth => :true, :luck => :true})
    wealth.set_probability(0.45, {:wealth => :false, :luck => :true})
    wealth.set_probability(0.45, {:wealth => :true, :luck => :false})
    wealth.set_probability(0.55, {:wealth => :false, :luck => :false})

    #derived variables

    work = Sbn::Variable.new(net, :work)
    wealth.add_child(work)
    health.add_child(work)

    work.set_probability(0.8, {:work => :true, :wealth => :true, :health => :true})
    work.set_probability(0.2, {:work => :false, :wealth => :true, :health => :true})
    work.set_probability(0.2, {:work => :true, :wealth => :true, :health => :false})
    work.set_probability(0.8, {:work => :false, :wealth => :true, :health => :false})
    work.set_probability(0.5, {:work => :true, :wealth => :false, :health => :true})
    work.set_probability(0.5, {:work => :false, :wealth => :false, :health => :true})
    work.set_probability(0.1, {:work => :true, :wealth => :false, :health => :false})
    work.set_probability(0.9, {:work => :false, :wealth => :false, :health => :false})

    money = Sbn::Variable.new(net, :money)
    wealth.add_child(money)

    money.set_probability(0.6, {:money => :true, :wealth => :true})
    money.set_probability(0.4, {:money => :false, :wealth => :true})
    money.set_probability(0.2, {:money => :true, :wealth => :false})
    money.set_probability(0.8, {:money => :false, :wealth => :false})

    family = Sbn::Variable.new(net, :family)
    love.add_child(family)
    work.add_child(family)

    family.set_probability(0.8, {:family => :true, :love => :true, :work => :true})
    family.set_probability(0.2, {:family => :false, :love => :true, :work => :true})
    family.set_probability(0.6, {:family => :true, :love => :true, :work => :false})
    family.set_probability(0.4, {:family => :false, :love => :true, :work => :false})
    family.set_probability(0.3, {:family => :true, :love => :false, :work => :true})
    family.set_probability(0.7, {:family => :false, :love => :false, :work => :true})
    family.set_probability(0.1, {:family => :true, :love => :false, :work => :false})
    family.set_probability(0.9, {:family => :false, :love => :false, :work => :false})

    #generate evidence
    luck_value = rand(2) == 1  ? «true».to_sym : «false».to_sym

    evidence = {:luck => luck_value}

    net.set_evidence(evidence)

    #lookup derived variables, and calculate a value

    love_value = rand(0) < net.query_variable(:love)[:true] ? true : false
    health_value = rand(0) < net.query_variable(:health)[:true] ? true : false
    wealth_value = rand(0) < net.query_variable(:wealth)[:true] ? true : false
    work_value = rand(0) < net.query_variable(:work)[:true] ? true : false
    money_value = rand(0) < net.query_variable(:money)[:true] ? true : false
    family_value = rand(0) < net.query_variable(:family)[:true] ? true : false

    puts «luck: #{luck_value} [love: #{love_value} » + \
    «(family: #{family_value}), health: #{health_value}, » + \
    «wealth: #{wealth_value} (work: #{work_value}, money: #{money_value})]»

    #puts «end: #{Time.now}»


  • el branding no está muerto

    Excelentes las conclusiones de Roger Dooley en neuromarketing:el branding no está muerto, pero ahora más que nunca tiene que ser auténtico. Responde con algunos datos a un post que dice que el branding está muerto por culpa de internet. Estoy de acuerdo en que el branding no está muerto pero en un momento en el que internet irrumpe modificandolo todo, el branding ha cambiado. Ya no puede basarse en ofrecer una imagen unidireccional de una marca, la imagen publicitaria controlada por la emisión en televisiones, radios y periódicos sino que tiene que tener en cuenta la opinión de los usuarios que ahora también tienen voz. Y esa opinión puede tener tanta audiencia cómo la imagen publicitaria de la marca, cómo muestra un video sobre united airlines que cuenta la historia de un músico al que United Airlines le ha destrozado su guitarra.

    Cómo explica Roger, todo el trabajo de imagen de marca tirado a la basura porque la empresa no cumple la promesa que promete la publicidad. Esto será cada vez más habitual, sobretodo en las empresas que no están acostumbradas a la bidireccionalidad de internet: un comentario en un blog, un video en youtube, un enlace en twitter puede hacer mucho daño, pero la imagen de una marca resistirá mejor si es coherente con el comportamiento de la empresa.

    Unos 5 millones de visualizaciones y 33.000 personas que encuentran el video gracioso, significa que probablemente muchas personas se han sentido identificadas con esta situación.

    Actualización: según el mundo, las compañías aéreas están preocupadas. Reconocer el problema es el principio, pero esperemos que entiendan que el problema no son las redes sociales en sí.