0

我有一个具有四个连续特征的两类贝叶斯分类问题。我正在尝试部分重现 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) 或任何技术建议如何设置编译器/IDE,我可以调试 Orange C++ 代码并检查来自 orange/source/orange/bayes.cpp 中的函数的一些中间结果?

4

1 回答 1

0

根据 Kononenko 的说法,Orange 使用了一个稍微不同的公式,它给出了相同的结果,但允许更好的可解释性和概率的 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 和库。

于 2015-06-18T16:16:16.567 回答