¿Tomar registros para vectorizar la multiplicación repetida es el enfoque correcto?

Recientemente escribí una implementación de Naive Bayes para clasificar los ejemplos en uno de 5 grupos diferentes. El número de funciones n era muy grande, y cada función podría estar activada (1) o desactivada (0). Usando el conjunto de entrenamiento, calculé una matriz P de 5 × n de probabilidades condicionales para cada grupo Gi contra cada característica Fj, para 1≤i≤5, 1≤j≤n, de modo que la celda (i, j) = P (Gi= 1 | Fj= 1). (Estoy ignorando las probabilidades P (Gi= 1 | Fj= 0) ya que no son relevantes para esta discusión.)

Lo que quería hacer era, dado un nuevo ejemplo E, un vector 1xn, multiplicar juntas las probabilidades condicionales de la matriz P correspondientes a las características que estaban en el nuevo ejemplo. Tuve dos preocupaciones al hacer esto:

la gran cantidad de características significa que un bucle sería muy lentola multiplicación repetida podría llevar a la pérdida de precisión

Lo que hice fue tomar el registro de P, L = log (P) y luego realizar la multiplicación de matriz E L '. La multiplicación da un resultado de 1 × 5 y el máximo del resultado indica qué grupo, asumiendo probabilidades previas de igual a igual. Esto resuelve el problema de la velocidad a través de la vectorización y el problema de la precisión al tomar los registros (y, por supuesto, al llevar los registros se transforma la multiplicación a la suma). Otra ventaja es que E L 'funcionaría para un conjunto de ejemplos de entrenamiento donde E era una matriz en lugar de un vector.

Mi pregunta es, ¿tomar registros como este es un enfoque razonable / estándar? Parece que podría ser el enfoque obvio, "101", pero tengo experiencia limitada en la implementación de algoritmos como este, por lo que agradecería los comentarios de aquellos con más experiencia.

Para referencia, en el enfoque de Naive Bayes, el teorema de Bayes da la probabilidad de estar en el grupo g condicional en las característicasF= f como

P (G = g |F= f ) = P (F= f| G = g) P (G = g) / P (F= f )

Expandiendo el vector de característicasF en F1..n da

P (G = g | F1= f1, F2= f2... Fn= fn) = P (F1= f1, F2= f2... Fn= fn| G = g) P (G = g) / P (F= f )

Aplicando el supuesto ingenuo de características independientes.

P (G = g | F1= f1, F2= f2... Fn= fn) = P (F1= f1| G = g) P (F2= f2| G = g) ... P (Fn= fn| G = g) P (G = g) / P (F= f )

El denominador se puede eliminar ya que es el mismo para todos g, por lo que tenemos

P (G = g | F1= f1, F2= f2... Fn= fn) ∝ P (F1= f1| G = g) P (F2= f2| G = g) ... P (Fn= fn| G = g) P (G = g)

Aquí, P (G = g) es la probabilidad previa.

Respuestas a la pregunta(1)

Su respuesta a la pregunta