2010-10-25 66 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