具有连续特征的橙色贝叶斯算法
Orange Bayes algorithm with continuous features
我有一个带有四个连续特征的两个 class 贝叶斯 class 化问题。我正在尝试部分重现 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 对象 classifier.conditional_distributions 中给出的两个 classes 输出 49 个点。通过在 Xi 的周围点之间使用线性插值,我可以计算 p(Xi|class0) 和 p(Xi|class1)。
1)谁能评论一下具有连续特征的Orange Bayes算法?
2) 或者任何技术建议如何设置 compiler/IDE 我可以调试 Orange C++ 代码并检查 orange/source/orange/bayes.cpp?
中函数的一些中间结果
Orange 使用了一个略有不同的公式,根据 Kononenko 的说法,该公式给出了相同的结果,但允许更好的解释性和概率的 m 估计。它计算的不是乘积 ( p(Xi|class0) ) 乘积 ( p(class0|Xi) / p(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,所以无法查看。但是我从来没有真正在任何其他 OS.
上调试过 Orange
如果加载项目并构建调试版本,则还必须构建 Python 的调试版本。这实际上很简单(请参阅 Python 源代码中的说明),问题是您必须构建您使用的任何其他二进制库(例如 numpy)的调试版本。一种更简单的方法是构建 Orange 的发布版本,但打开调试信息标志。这样您就可以使用标准 Python 和库。
我有一个带有四个连续特征的两个 class 贝叶斯 class 化问题。我正在尝试部分重现 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 对象 classifier.conditional_distributions 中给出的两个 classes 输出 49 个点。通过在 Xi 的周围点之间使用线性插值,我可以计算 p(Xi|class0) 和 p(Xi|class1)。
1)谁能评论一下具有连续特征的Orange Bayes算法?
2) 或者任何技术建议如何设置 compiler/IDE 我可以调试 Orange C++ 代码并检查 orange/source/orange/bayes.cpp?
中函数的一些中间结果Orange 使用了一个略有不同的公式,根据 Kononenko 的说法,该公式给出了相同的结果,但允许更好的解释性和概率的 m 估计。它计算的不是乘积 ( p(Xi|class0) ) 乘积 ( p(class0|Xi) / p(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,所以无法查看。但是我从来没有真正在任何其他 OS.
上调试过 Orange如果加载项目并构建调试版本,则还必须构建 Python 的调试版本。这实际上很简单(请参阅 Python 源代码中的说明),问题是您必须构建您使用的任何其他二进制库(例如 numpy)的调试版本。一种更简单的方法是构建 Orange 的发布版本,但打开调试信息标志。这样您就可以使用标准 Python 和库。