Question

Je suis en train d'ajouter le support de lissage Laplacien à Naive Bayes Code 1 pour mon projet bio-informatique.

J'ai lu beaucoup de documents sur l'algorithme Naive Bayes et lissage Laplacien et je pense que j'ai eu l'idée de base, mais je ne peux pas intégrer avec ce code (je ne peux pas vraiment voir quelle partie je vais ajouter 1 numéro -laplacian).

Je ne suis pas familier avec Python et je suis un codeur débutant. J'apprécie si quelqu'un connaît Biopython peut me donner quelques suggestions.

Était-ce utile?

La solution

Essayez d'utiliser cette définition de la méthode de la place _contents():

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

Modifiez ensuite l'appel sur Line 194 dans:

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

True utilisation pour permettre le lissage et False pour le désactiver.

Voici une comparaison de la sortie avec / sans le lissage:

# 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}]]

En dehors de ce qui précède, je pense qu'il pourrait y avoir un bug avec le code:

Le code divise les instances en fonction de leur classe, puis pour chaque classe, et donner à chaque dimension, il compte combien de fois chacune de ces valeurs dimension apparaissent.

Le problème est de savoir si un sous-ensemble des instances appartenant à une classe, il arrive que semblent pas toutes les valeurs d'une dimension dans ce sous-ensemble, puis lorsque la fonction _contents() est appelée, elle ne verra pas toutes les valeurs possibles, et donc renverra les mauvaises probabilités ...

Je pense que vous devez garder une trace des toutes les valeurs uniques pour chaque dimension (de l'ensemble des données) et tenir compte lors du processus de comptage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top