4

Bioinformatics プロジェクトの Biopython のナイーブ ベイズ コード1にラプラシアン スムージング サポートを追加しようとしています。

ナイーブ ベイズ アルゴリズムとラプラシアン スムージングに関する多くのドキュメントを読みましたが、基本的な考え方は理解できたと思いますが、これをそのコードと統合することはできません (実際、どの部分に 1 -ラプラシアン数を追加するかわかりません)。

私は Python に詳しくなく、初心者のコーダーです。Biopython に詳しい方からアドバイスをいただければ幸いです。

4

1 に答える 1

4

_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

次に、呼び出しを次のように変更しますLine 194

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

Trueスムージングを有効またはFalse無効にするために使用します。

スムージングあり/なしの出力の比較は次のとおりです。

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

上記以外に、コードにバグがある可能性があると思います。

このコードは、クラスに従ってインスタンスを分割し、次に各クラスについて、各ディメンションを指定して、この各ディメンション値が出現する回数をカウントします。

問題は、1 つのクラスに属するインスタンスのサブセットについて、ディメンションのすべての値がそのサブセットに表示されるとは限らず、_contents()関数が呼び出されたときにすべての可能な値が表示されないため、間違った値が返されることです。確率...

(データセット全体から) 各ディメンションのすべての一意の値を追跡し、カウント プロセス中にそれを考慮する必要があると思います。

于 2010-10-25T02:38:47.563 に答える