朴素贝叶斯:训练的每个特征的类内方差必须是正的



尝试拟合朴素贝叶斯时:

training_data = sample; % 
target_class = K8;
# train model
nb = NaiveBayes.fit(training_data, target_class);
# prediction
y = nb.predict(cluster3);

我得到一个错误:

??? Error using ==> NaiveBayes.fit>gaussianFit at 535
The within-class variance in each feature of TRAINING
must be positive. The within-class variance in feature
2 5 6 in class normal. are not positive.
Error in ==> NaiveBayes.fit at 498
obj = gaussianFit(obj, training, gindex);

有人能阐明这一点以及如何解决它吗?注意,我在这里读过类似的帖子,但我不知道该怎么办?似乎它试图根据列而不是行进行拟合,类方差应该基于每行属于特定类的概率。如果我删除这些列,那么它就可以了,但显然这不是我想做的

假设您的代码(或mathworks中的NaiveBayes代码)中没有任何错误,并且再次假设您的training_data是NxD的形式,其中有N个观测值和D个特征,那么至少一个类的第2、5和6列完全为零。如果你有相对较小的训练数据和大量的类,其中一个类可能由一些观察结果表示,就会发生这种情况。由于NaiveBayes默认情况下将所有特征视为正态分布的一部分,因此它无法处理与单个类相关的所有特征方差为零的列。换句话说,NaiveBayes没有办法通过将正态分布拟合到特定类别的特征来找到概率分布的参数(注意:分布的默认值是normal)。

看看你的特征的本质。如果它们在每个类中似乎不遵循正态分布,那么normal不是您想要使用的选项。也许你的数据更接近多项式模型mn:

nb = NaiveBayes.fit(training_data, target_class, 'Distribution', 'mn');

最新更新