Pregunta

Estoy tratando de añadir soporte de suavizado de Laplace a Naive Bayes código de Biopython 1 para mi proyecto de Bioinformática.

He leído muchos documentos sobre el algoritmo Bayes naive y suavizado de Laplace y creo que me dio la idea básica, pero simplemente no puedo integrar este con ese código (en realidad no puedo ver qué parte voy a añadir al menos 1 cantidad -laplacian).

No estoy familiarizado con Python y yo soy un programador novato. Agradezco si alguien familiarizado con Biopython me puede dar algunas sugerencias.

¿Fue útil?

Solución

Trate de usar esta definición del método _contents() lugar:

def _contents(items, laplace=False):
    # count occurrences of values
    counts = {}
    for item in items:
        counts[item] = counts.get(item,0) + 1.0
    # normalize
    for k in counts:
        if laplace:
            counts[k] += 1.0
            counts[k] /= (len(items)+len(counts))
        else:
            counts[k] /= len(items)
    return counts

A continuación, cambiar la llamada en Line 194 en:

# Estimate P(value|class,dim)
nb.p_conditional[i][j] = _contents(values, True)

El uso True para activar el suavizado y False para desactivarla.

He aquí una comparación de la salida con / sin el suavizado:

# without
>>> carmodel.p_conditional
[[{'Red': 0.40000000000000002, 'Yellow': 0.59999999999999998},
  {'SUV': 0.59999999999999998, 'Sports': 0.40000000000000002},
  {'Domestic': 0.59999999999999998, 'Imported': 0.40000000000000002}],
 [{'Red': 0.59999999999999998, 'Yellow': 0.40000000000000002},
  {'SUV': 0.20000000000000001, 'Sports': 0.80000000000000004},
  {'Domestic': 0.40000000000000002, 'Imported': 0.59999999999999998}]]

# with
>>> carmodel.p_conditional
[[{'Red': 0.42857142857142855, 'Yellow': 0.5714285714285714},
  {'SUV': 0.5714285714285714, 'Sports': 0.42857142857142855},
  {'Domestic': 0.5714285714285714, 'Imported': 0.42857142857142855}],
 [{'Red': 0.5714285714285714, 'Yellow': 0.42857142857142855},
  {'SUV': 0.2857142857142857, 'Sports': 0.7142857142857143},
  {'Domestic': 0.42857142857142855, 'Imported': 0.5714285714285714}]]

Además de lo anterior, creo que podría ser un error con el código:

El código divide los casos según su clase, y luego para cada clase, y dando a cada dimensión, cuenta cuántas veces cada uno de esta dimensión aparecen valores.

El problema es que si para un subconjunto de las instancias que pertenecen a una clase, ocurre que no todos los valores de una dimensión aparecen en ese subconjunto, a continuación, cuando la función _contents() se llama, no va a ver todos los valores posibles, y por lo tanto devolverá las probabilidades equivocadas ...

creo que necesita para mantener un registro de todos los valores únicos para cada dimensión (de todo el conjunto de datos), y tomar esto en consideración durante el proceso de conteo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top