【问题标题】:Orange Bayes algorithm with continuous features具有连续特征的橙色贝叶斯算法
【发布时间】:2015-06-19 00:16:16
【问题描述】:

我有一个具有四个连续特征的二级贝叶斯分类问题。我正在尝试部分重现 Orange 用于计算概率的贝叶斯算法算法。但是我没有成功获得与 Orange 输出相同的值。

数据集大小:150(class0:88 和 class1:62)

我使用以下算法

p(class0 | X1, X2, X3, X4) = L0 / (L0 + L1)
p(class1 | X1, X2, X3, X4) = L1 / (L0 + L1)

其中 L0 和 L1 是可能性

L0 = prior_class0 * product( p(Xi|class0) )
L1 = prior_class1 * product( p(Xi|class1) )

prior_class0 and prior_class1 are Laplacian estimators

prior_class0 = (88 + 1) / (150 + 2)
prior_class1 = (62 + 1) / (150 + 2)

Orange 使用 LOESS 来计算条件概率(我想没有必要重现它)。对于这个数据集,它为 python 对象分类器.conditional_distributions 中给出的两个类输出 49 个点。通过在 Xi 的周围点之间使用线性插值,我可以计算 p(Xi|class0) 和 p(Xi|class1)。

1) 任何人都可以评论具有连续特征的橙色贝叶斯算法吗?

2) 或任何技术建议如何设置我可以调试 Orange C++ 代码并检查来自 orange/source/orange/bayes.cpp 中的函数的一些中间结果的编译器/IDE?

【问题讨论】:

    标签: orange


    【解决方案1】:

    Orange 使用了一个稍微不同的公式,根据 Kononenko 的说法,它给出了相同的结果,但允许更好的可解释性和概率的 m 估计。它计算的是 product( p(class0|Xi) / p(class0)),而不是 product( p(Xi|class0) )。不过,我认为这不会影响您的计算,但您可以检查一下。计算这些概率的代码位于https://github.com/biolab/orange/blob/master/source/orange/bayes.cpp#L169。请注意,它同时对所有类执行此操作。

    您感兴趣的另一段代码是根据 LOESS 密度估计计算概率。它位于https://github.com/biolab/orange/blob/master/source/orange/estimateprob.cpp#L307。请注意,大多数操作都在向量上,例如*result *= (x-x1)/(x2-x1); 中的所有变量实际上都是向量。

    至于调试,我用 Visual Studio 编写了这段代码(很多年前,有点羞于承认——看到我使用的糟糕的编码风格)。我忘记了版本,因为我不再使用 Windows,所以无法检查它。但我从来没有在任何其他操作系统上真正调试过 Orange。

    如果您加载项目并构建调试版本,您还必须构建 Python 的调试版本。这实际上很简单(请参阅 Python 源代码中的说明),问题是您还必须构建您使用的任何其他二进制库的调试版本(例如 numpy)。一种更简单的方法是构建 Orange 的发布版本,但打开调试信息标志。这样您就可以使用标准 Python 和库。

    【讨论】:

    • 感谢您的回答!除法 p(class0|Xi) / p(class0) 有所不同,我现在得到与橙色输出相同的结果。因此,为 ex L0 =prior_class0 * product( p(Xi|class0) / p(class0) ) 计算似然性。然而问题出现了,这个公式与贝叶斯定理有什么关系?如果我理解正确,那么在贝叶斯定理中,可能性是通过将先验概率与原始帖子中的条件概率相乘来计算的。您能否提供一些参考来证明 Orange 使用的公式是正确的,因为我对贝叶斯分类不是很熟悉?
    猜你喜欢
    • 2012-11-18
    • 2014-01-31
    • 2021-07-19
    • 2021-11-13
    • 2015-01-24
    • 1970-01-01
    • 2016-08-16
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多