2009-12-29 16 views
9

Estoy trabajando en una implementación de un clasificador Naive Bayes. Programming Collective Intelligence introduce este tema describiendo el Teorema de Bayes como:Comprensión del teorema de Bayes

Pr(A | B) = Pr(B | A) x Pr(A)/Pr(B) 

Así como un ejemplo específico relevante para la clasificación de documentos:

Pr(Category | Document) = Pr(Document | Category) x Pr(Category)/Pr(Document) 

Yo estaba esperando que alguien podría explicarme la notación utilizada aquí, ¿qué hacer Pr (A | B) y Pr (A) significan? Parece un tipo de función, pero ¿qué significa la tubería, etc.? (Estoy un poco perdido)

Gracias de antemano.

+1

definitivamente una pregunta de http://mathoverflow.net/. –

+10

@Ofri Raviv: lo dudo. MathOverflow es para matemáticos profesionales, esta pregunta se cerrará de inmediato. –

+1

Utilice mathoverflow.net. Mi única preocupación es que esta pregunta se cerrará allí por ser demasiado simple. –

Respuesta

11
  • Pr (A | B) = probabilidad de un suceso dado que B ya ha sucedido
  • Pr (A) = Probabilidad de un suceso

Pero lo anterior es con respecto al cálculo de probabilidad condicional Lo que quiere es un clasificador, que utilice este principio para decidir si algo pertenece a una categoría en función de la probabilidad previa.

Ver http://en.wikipedia.org/wiki/Naive_Bayes_classifier para un ejemplo completo

+0

Gracias, tiene sentido. En todas partes se describe un cierto conocimiento matemático, cierto conocimiento que no tengo :-). – benofsky

1

Pr (A | B): La probabilidad condicional de A: la probabilidad es decir, de A, dado que todo lo que sabemos es B

Pr (A): la probabilidad previa de una

1

el tubo (|) significa "dado". La probabilidad de A dada B es igual a la probabilidad de B dada A x Pr (A)/Pr (B)

1

En base a su pregunta, puedo recomendar encarecidamente que primero necesite leer algún libro de pregrado sobre Probability Theory . Sin esto, no avanzarás correctamente con tu tarea en Naive Bayes Classifier.

Yo recomendaría este libro http://www.athenasc.com/probbook.html o mira MIT OpenCourseWare.

+0

Gracias, definitivamente voy a echarle un vistazo a eso. – benofsky

0

Parece que estoy escribiendo exactamente lo mismo que lo hace :)

yo estaba tratando de encontrar una biblioteca (en Ruby) para la clasificación de documentos utilizando Naive Bayes. Encontré varias bibliotecas, pero cada una tenía su propio conjunto de problemas. Así que terminé escribiendo mi propia implementación. El artículo de la wikipedia es muy confuso, especialmente si eres nuevo en este tipo de cosas. Para mí, los artículos de Paul Graham sobre la implementación del filtro de spam fueron mucho mejores.

He documentado los detalles aquí: http://arubyguy.com/2011/03/03/bayes-classification-update/ También voy a publicar la versión final de mi implementación cuando esté hecha así que si está interesado en la solución de Ruby es posible que desee ver eso.

4

Creo que lo tienen cubierto en lo básico.

Pr(A | B) = Pr(B | A) x Pr(A)/Pr(B) 

dice lo siguiente: la probabilidad de A dado B es la misma que la probabilidad de B dado A veces la probabilidad de A dividida por la probabilidad de B. Por lo general se utiliza cuando se puede medir la probabilidad de B y estamos tratando de descubrir si B nos está llevando a creer en A. O, en otras palabras, realmente nos importa A, pero podemos medir B más directamente, así que comencemos con lo que podemos medir.

Déjeme darle una derivación que hace que esto sea más fácil para escribir el código. Viene de Judea Pearl. Luché un poco con esto, pero después de darme cuenta de cómo Pearl nos ayuda a convertir la teoría en código, la luz se encendió para mí.

Odds Ratio previos:

O(H) = P(H)/1 - P(H) 

Probabilidad:

L(e|H) = P(e|H)/P(e|¬H) 

posteriores Probabilidades:

O(H|e) = L(e|H)O(H) 

En Inglés, nos dicen que las probabilidades de algo que les interesa (H para hipótesis) son simplemente la cantidad de veces que encuentras algo verdadero dividido entre las veces que encuentra que no es verdad Entonces, digamos que una casa es robada todos los días de 10,000. Eso significa que tiene una posibilidad de 1/10.000 de robo, sin que se considere ninguna otra evidencia.

El siguiente es medir la evidencia que está viendo. ¿Cuál es la probabilidad de ver la evidencia que está viendo cuando su pregunta es verdadera dividida por la probabilidad de ver la evidencia que está viendo cuando su pregunta no es cierta? Supongamos que escuchas que se apaga tu alarma antirrobo. ¿Con qué frecuencia recibe esa alarma cuando se supone que se dispara (alguien abre una ventana cuando la alarma está encendida) frente a cuándo no se debe apagar (el viento apaga la alarma). Si tienes un 95% de probabilidad de que un ladrón active la alarma y un 1% de que otra persona encienda la alarma, entonces tienes una probabilidad de 95.0.

Su creencia general es la probabilidad * de las probabilidades anteriores. En este caso es:

((0.95/0.01) * ((10**-4)/(1 - (10**-4)))) 
# => 0.0095009500950095 

No sé si esto hace que sea más claro, pero tiende a ser más fácil tener un código que realiza un seguimiento de probabilidades previas, otro código para mirar probabilidades, y una pieza más de código para combinar esta información.

4

Lo he implementado en Python. Es muy fácil de entender, porque todas las fórmulas para el teorema de Bayes están en funciones separadas:

#Bayes Theorem 

def get_outcomes(sample_space, f_name='', e_name=''): 
    outcomes = 0 
    for e_k, e_v in sample_space.items(): 
     if f_name=='' or f_name==e_k: 
      for se_k, se_v in e_v.items(): 
       if e_name!='' and se_k == e_name: 
        outcomes+=se_v 
       elif e_name=='': 
        outcomes+=se_v 
    return outcomes 

def p(sample_space, f_name): 
    return get_outcomes(sample_space, f_name)/get_outcomes(sample_space, '', '') 

def p_inters(sample_space, f_name, e_name): 
    return get_outcomes(sample_space, f_name, e_name)/get_outcomes(sample_space, '', '') 

def p_conditional(sample_space, f_name, e_name): 
    return p_inters(sample_space, f_name, e_name)/p(sample_space, f_name) 

def bayes(sample_space, f, given_e): 
    sum = 0; 
    for e_k, e_v in sample_space.items(): 
     sum+=p(sample_space, e_k) * p_conditional(sample_space, e_k, given_e) 
    return p(sample_space, f) * p_conditional(sample_space, f, given_e)/sum 

sample_space = {'UK':{'Boy':10, 'Girl':20}, 
       'FR':{'Boy':10, 'Girl':10}, 
       'CA':{'Boy':10, 'Girl':30}} 

print('Probability of being from FR:', p(sample_space, 'FR')) 
print('Probability to be French Boy:', p_inters(sample_space, 'FR', 'Boy')) 
print('Probability of being a Boy given a person is from FR:', p_conditional(sample_space, 'FR', 'Boy')) 
print('Probability to be from France given person is Boy:', bayes(sample_space, 'FR', 'Boy')) 

sample_space = {'Grow' :{'Up':160, 'Down':40}, 
       'Slows':{'Up':30, 'Down':70}} 

print('Probability economy is growing when stock is Up:', bayes(sample_space, 'Grow', 'Up')) 
3

Personalmente, creemos que esta explicación del best

0

El tubo se utiliza para representar la probabilidad condicional. Pr (A | B) = probabilidad de A dado B

Ejemplo: Digamos que usted no se siente bien y navegar por la web para los síntomas. Y Internet le dice que si tiene estos síntomas, entonces tiene la enfermedad XYZ.

En este caso: Pr (A | B) es lo que está tratando de averiguar, que es: La probabilidad de que tenga XYZ DADO QUE tiene ciertos síntomas.

Pr (A) es la probabilidad de tener la enfermedad XYZ

Pr (B) es la probabilidad de tener esos síntomas

Pr (B | A) es lo que se encuentra fuera de la Internet, cuál es: La probabilidad de tener los síntomas DADOS QUE tienes la enfermedad.