smoothing Laplaciano a Biopython
-
25-09-2019 - |
Domanda
Sto cercando di aggiungere il supporto smoothing Laplacian al codice Naive Bayes di Biopython 1 per il mio progetto Bioinformatica.
Ho letto molti documenti su algoritmo Naive Bayes e levigante Laplacian e penso che ho avuto l'idea di base, ma non riesco proprio a integrare questo con quel codice (in realtà non riesco a vedere quale parte vorrei aggiungere 1 numero -laplacian).
Non ho familiarità con Python e io sono un codificatore newbie. Apprezzo se chiunque abbia familiarità con Biopython mi può dare qualche suggerimento.
Soluzione
Provare a utilizzare questa definizione del metodo _contents()
invece:
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
Poi cambia la chiamata Line 194
in:
# Estimate P(value|class,dim)
nb.p_conditional[i][j] = _contents(values, True)
uso True
modo che il livellamento, e False
per disabilitarlo.
Ecco un confronto tra l'uscita con / senza la levigatura:
# 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}]]
A parte quanto sopra, credo che ci potrebbe essere un bug con il codice:
Il codice divide le istanze in base alla loro classe, e quindi per ogni classe, e dando ogni dimensione, conta quante volte ognuno di questa dimensione appaiono valori.
Il problema è che se per un sottoinsieme delle istanze appartenenti ad una classe, accade che non tutti i valori di una dimensione appaiono in quel sottoinsieme, quindi quando viene chiamata la funzione _contents()
, non vedrà tutti i valori possibili, e quindi restituirà le probabilità sbagliate ...
Credo che hai bisogno di tenere traccia di tutte le i valori unici per ciascuna dimensione (da tutto il set di dati), e prendere in considerazione che durante il processo di conteggio.