Pergunta

Estou tentando adicionar suporte de suavização Laplacian ao código ingênuo do Biopython do Biopython 1 Para o meu projeto de bioinformática.

Eu já li muitos documentos sobre o algoritmo de Bayes em Nive e a suavização de Laplacian e acho que tive a ideia básica, mas não consigo integrar isso com esse código (na verdade não consigo ver qual parte adicionarei um número 1 -laplaciano).

Não estou familiarizado com o Python e sou um codificador novato. Agradeço se alguém familiarizado com o Biopython pode me dar algumas sugestões.

Foi útil?

Solução

Tente usar esta definição do _contents() Método em vez disso:

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

Em seguida, altere a chamada em Line 194 em:

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

usar True para ativar a suavização e False para desativá -lo.

Aqui está uma comparação da saída com/sem suavização:

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

Além do exposto, acho que pode haver um bug com o código:

O código divide as instâncias de acordo com a classe e, em seguida, para cada classe, e dando a cada dimensão, conta quantas vezes cada um desses valores de dimensão aparece.

O problema é se, para um subconjunto das instâncias pertencentes a uma classe, acontece que nem todos os valores de uma dimensão aparecem nesse subconjunto, então quando o _contents() A função é chamada, não verá todos os valores possíveis e, portanto, retornará as probabilidades erradas ...

Eu acho que você precisa acompanhar todos os valores exclusivos para cada dimensão (de todo o conjunto de dados) e levar isso em consideração durante o processo de contagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top