2010-10-25 93 views
3

我想爲我的生物信息學項目添加拉普拉斯平滑支持Biopython的樸素貝葉斯代碼1拉普拉斯平滑到Biopython

我已經閱讀了許多關於樸素貝葉斯算法和拉普拉斯平滑的文檔,我想我已經有了基本的想法,但我不能將它與該代碼集成(實際上我看不到哪個部分會添加1 -laplacian數字) 。

我不熟悉Python,我是一個新手編碼器。如果熟悉Biopython的人可以給我一些建議,我很感激。

+0

添加了+1作爲您的問題使我查找拉普拉斯平滑。我懷疑我是在大學的第一份工作中間接使用它的!雖然生物信息學不是我的領域,但我看不出它與樸素貝葉斯的關係。 – winwaed 2010-10-25 00:44:35

回答

3

嘗試使用_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}]] 

從上面

除此之外,我認爲有可能與代碼中的錯誤:

代碼拆分根據他們的類,然後對每個類,然後給每個維度計算每個維度值出現的次數。

問題是如果對於屬於一個類的實例子集,它並不是所有維度的值都出現在該子集中,那麼當調用_contents()函數時,它不會看到所有可能的值,並且因此將返回錯誤的概率...

我認爲您需要記錄每個維度(來自整個數據集)的所有唯一值,並在計數過程中考慮這一點。

+0

非常感謝!它對我有很大的幫助。當我嘗試使用拉普拉斯算子和拉普拉斯算子時,p_conditional概率是不同的。準確性沒有改變。這是我應該期待的嗎? – Limin 2010-10-25 12:35:20

+0

這一切都取決於所使用的數據集.. – Amro 2010-10-25 17:06:08

+0

也請記住,代碼期望所有維度值顯示爲每個類標籤,否則我懷疑結果將不正確(最後提到的可能的錯誤) – Amro 2010-10-25 17:08:01