编程语言
首页 > 编程语言> > 拉普拉斯平滑到Biopython

拉普拉斯平滑到Biopython

作者:互联网

我正在尝试为我的Bioinformatics项目的Biopython朴素贝叶斯代码1添加Laplacian平滑支持.

我已经阅读了许多有关朴素贝叶斯算法和拉普拉斯平滑的文档,我想我有基本的想法,但是我无法将此代码与该代码集成在一起(实际上我看不到要添加1 -laplacian数的部分).

我对Python不熟悉,并且是一名新手程序员.我感谢熟悉Biopython的任何人可以给我一些建议.

解决方法:

尝试改用_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

然后将第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()函数时,它将看不到所有可能的值,因此将返回错误的概率…

我认为您需要跟踪每个维度(来自整个数据集)的所有唯一值,并在计数过程中将其考虑在内.

标签:biopython,bayesian,machine-learning,python
来源: https://codeday.me/bug/20191105/1997234.html