我在进行生物信息学项目时,尝试在Biopython的朴素贝叶斯代码1中添加拉普拉斯平滑支持。
我阅读了许多关于朴素贝叶斯算法和拉普拉斯平滑的文档,我认为我已经掌握了基本概念,但就是无法将这些概念与代码整合(实际上我不知道在哪里添加1-拉普拉斯数)。
我不熟悉Python,而且是一个编程新手。如果有熟悉Biopython的人能给我一些建议,我将不胜感激。
回答:
尝试使用以下_contents()
方法的定义:
def _contents(items, laplace=False): # 统计值的出现次数 counts = {} for item in items: counts[item] = counts.get(item,0) + 1.0 # 归一化 for k in counts: if laplace: counts[k] += 1.0 counts[k] /= (len(items)+len(counts)) else: counts[k] /= len(items) return counts
然后将第194行
的调用改为:
# 估计P(value|class,dim)nb.p_conditional[i][j] = _contents(values, True)
使用True
启用平滑,使用False
禁用平滑。
以下是启用和禁用平滑后的输出对比:
# 未启用>>> 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}]]# 已启用>>> 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()
函数时,它将不会看到所有可能的值,从而返回错误的概率…
我认为你需要跟踪每个维度的所有唯一值(来自整个数据集),并在计数过程中考虑这些值。