12 votos

Akinator.com y clasificador de Naive Bayes

Contexto: Soy un programador con algo (casi olvidada) experiencia en estadística de cursos universitarios. Recientemente me encontré con http://akinator.com y pasé un tiempo intentando hacer que fallara. ¿Y quién no? :)

Decidí averiguar cómo podría funcionar. Después de buscar en Google y leer publicaciones de blogs relacionadas y añadir algo de mi (limitado) conocimiento en la mezcla resultante, llegué al siguiente modelo (estoy seguro de que usaré la notación incorrecta, por favor no me maten por eso):

Hay Sujetos (S) y Preguntas (Q). El objetivo del predictor es seleccionar el sujeto S que tiene la mayor probabilidad a posteriori de ser el sujeto en el que el usuario está pensando, dadas las preguntas y respuestas recopiladas hasta ahora.

Sea el juego G un conjunto de preguntas realizadas y respuestas dadas: $\{q_1, a_1\}, \{q_2, a_2\} ... \{q_n, a_n\}$.

Entonces el predictor está buscando $P(S|G) = \frac{P(G|S) * P(S)}{P(G)}$.

La probabilidad previa para los sujetos ($P(S)$) podría ser solo el número de veces que se ha adivinado el sujeto dividido por el número total de juegos.

Haciendo la suposición de que todas las respuestas son independientes, podríamos calcular la probabilidad de que el sujeto S dada la partida G sea así:

$P(G|S) = \prod_{i=1..n} P(\{q_i, a_i\} | S)$

Podríamos calcular el $P(\{q_i, a_i\} | S)$ si hacemos un seguimiento de qué preguntas y respuestas se dieron cuando el usuario pensó en un sujeto específico:

$P({q, a} | S) = \frac{la\ respuesta\ a\ fue\ dada\ a\ la\ pregunta\ q\ en\ el\ juego\ cuando\ S\ fue\ el\ sujeto}{número\ de\ veces\ que\ se\ hizo\ la\ pregunta\ q\ en\ los\ juegos\ que\ involucraban\ a\ S}$

Ahora, $P(S|G)$ define una distribución de probabilidad sobre los sujetos y cuando necesitamos seleccionar la próxima pregunta debemos elegir aquella para la cual el cambio esperado en la entropía de esta distribución sea máximo:

$argmax_j (H[P(S|G)] - \sum_{a=sí,no,tal vez...} H[P(S|G \vee \{q_j, a\})]$

Intenté implementar esto y funciona. Pero, obviamente, a medida que aumenta el número de sujetos, el rendimiento se degrada debido a la necesidad de recalcular el $P(S|G)$ después de cada movimiento y de calcular la distribución actualizada $P(S|G \vee \{q_j, a\})$ para la selección de preguntas.

Sospecho que simplemente elegí el modelo incorrecto, limitado por los límites de mi conocimiento. O, tal vez, hay un error en las matemáticas. Por favor, ilumínenme: ¿con qué debería familiarizarme, o cómo cambiar el predictor para que pueda manejar millones de sujetos y miles de preguntas?

10voto

Oak Puntos 1366

Este juego parece similar a 20 preguntas en http://20q.net, que según el creador está basado en una red neuronal. Aquí hay una forma de estructurar dicha red, similar a la red neuronal descrita en Concept description vectors and the 20 question game.

Tendrías

  1. Un número fijo de preguntas, con algunas marcadas como preguntas "finales".
  2. Una unidad de entrada por pregunta, donde 0/1 representa no/sí. Inicialmente establecida en 0.5.
  3. Una unidad de salida por pregunta, aplastada sigmoidalmente en un rango de 0 a 1.
  4. Capa oculta conectando todas las unidades de entrada con todas las unidades de salida.

Las unidades de entrada para las preguntas que han sido respondidas se establecen en 0 o 1, y la suposición es que la red neuronal ha sido entrenada para hacer que las unidades de salida produzcan valores cercanos a 1 para las preguntas que tienen respuesta "Sí" dadas un conjunto de respuestas existentes.

En cada etapa elegirías la pregunta que NN tiene menos certeza sobre, es decir, la unidad de salida correspondiente está cercana a 0.5, hacer la pregunta y establecer la unidad de entrada correspondiente a la respuesta. En la última etapa eliges una unidad de salida de la lista de "preguntas finales" con un valor más cercano a 1.

Cada juego de 20 preguntas da 20 puntos de datos que puedes utilizar para actualizar los pesos de NN con retropropagación, es decir, actualizas los pesos para que las salidas de la red neuronal actual coincidan con la respuesta verdadera dadas todas las preguntas previas realizadas.

7voto

guillermooo Puntos 2711

No creo que realmente sea un problema de clasificación. 20 preguntas a menudo se caracterizan como un problema de compresión. Esto en realidad coincide mejor con la última parte de tu pregunta donde hablas sobre la entropía.

Ver Capítulo 5.7 (Google books) de

Cover, T.M. y Joy, A.T. (2006) Elementos de la Teoría de la Información

y también código de Huffman. Este papel que encontré en arXiv también puede ser de interés.

Gill, J.T. y Wu, W. (2010) "Twenty Questions Games Always End With Yes” http://arxiv.org/abs/1002.4907

Para simplificar, asume preguntas de sí/no (mientras que akinator.com permite quizá, no sé). Asume que cada posible sujeto (lo que akinator.com conoce) puede ser identificado de manera única por una secuencia de preguntas y respuestas de sí/no, esencialmente un vector binario.

Las preguntas (y sus respuestas) que se hacen definen una partición recursiva del espacio de los sujetos. Esta partición corresponde también a una estructura de árbol. Los vértices interiores del árbol corresponden a preguntas, y las hojas corresponden a sujetos. La profundidad de las hojas es exactamente el número de preguntas requeridas para identificar de manera única el sujeto. Puedes identificar (trivialmente) a cada sujeto conocido haciendo cada pregunta posible. Eso no es interesante porque podría haber potencialmente cientos de preguntas.

La conexión con el código de Huffman es que proporciona una manera óptima (bajo un cierto modelo probabilístico) de construir el árbol de manera que la profundidad promedio sea (casi) mínima. En otras palabras, te dice cómo organizar la secuencia de preguntas (construir un árbol) para que el número de preguntas que necesitas hacer sea en promedio pequeño. Utiliza un enfoque codicioso.

Por supuesto, hay más en akinator.com que esto, pero la idea básica es que puedes pensar en el problema en términos de un árbol e intentar minimizar la profundidad promedio de sus hojas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X