lissage Laplacien à Biopython
-
25-09-2019 - |
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.
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.