将拉普拉斯平滑添加到Biopython

我在进行生物信息学项目时,尝试在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()函数时,它将不会看到所有可能的值,从而返回错误的概率…

我认为你需要跟踪每个维度的所有唯一值(来自整个数据集),并在计数过程中考虑这些值。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注