我正在编写一个朴素贝叶斯分类器,用于根据 WiFi 信号强度执行室内房间定位。到目前为止,它运行良好,但我对缺少的功能有一些疑问。这种情况经常发生,因为我使用 WiFi 信号,而 WiFi 接入点根本不是随处可用。
问题 1:假设我有两个类,Apple 和 Banana,我想将测试实例 T1 分类如下。
我完全理解朴素贝叶斯分类器的工作原理。下面是我在维基百科关于分类器的文章中使用的公式。我正在使用统一的先验概率P(C=c),所以我在我的实现中省略了它。
现在,当我计算等式的右侧并遍历所有类条件特征概率时,我使用哪一组特征?测试实例 T1 使用了特征 1、3 和 4,但是这两个类并不具备所有这些特征。因此,当我执行循环来计算概率积时,我看到了几个关于循环内容的选择:
- 循环遍历训练中所有特征的并集,即特征 1、2、3、4。由于测试实例 T1 没有特征 2,因此使用人为的微小概率。
- 仅循环测试实例的特征,即 1、3 和 4。
- 循环遍历每个类可用的功能。要计算“Apple”的类别条件概率,我将使用特征 1、2 和 3,而对于“Banana”,我将使用 2、3 和 4。
我应该使用以上哪个?
问题 2:假设我想对测试实例 T2 进行分类,其中 T2 具有两个类中都没有的特征。我正在使用日志概率来帮助消除下溢,但我不确定循环的细节。我正在做这样的事情(在类似 Java 的伪代码中):
Double bestLogProbability = -100000;
ClassLabel bestClassLabel = null;
for (ClassLabel classLabel : allClassLabels)
{
Double logProbabilitySum = 0.0;
for (Feature feature : allFeatures)
{
Double logProbability = getLogProbability(classLabel, feature);
if (logProbability != null)
{
logProbabilitySum += logProbability;
}
}
if (bestLogProbability < logProbability)
{
bestLogProbability = logProbabilitySum;
bestClassLabel = classLabel;
}
}
问题是,如果没有一个类具有测试实例的特征(示例中的特征 5),那么 logProbabilitySum 将保持为 0.0,导致 bestLogProbability 为 0.0,或线性概率为 1.0,这显然是错误的。有什么更好的方法来处理这个?