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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top