朴素贝叶斯:培训的每个特征的内部差异必须是积极的

G G*_* Gr 7 matlab classification bayesian variance naivebayes

试图适应朴素贝叶斯时:

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

 # prediction
 y = nb.predict(cluster3);
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

??? 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);
Run Code Online (Sandbox Code Playgroud)

任何人都可以阐明这一点以及如何解决它?请注意,我在这里阅读了类似的帖子,但我不知道该怎么办?似乎它试图基于列而不是行来拟合,类方差应该基于属于特定类的每一行的概率.如果我删除那些列然后它可以工作,但显然这不是我想要做的.

Bee*_*Bee 13

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

看看你的功能的性质.如果它们似乎不遵循每个类中的正态分布,则normal不是您想要使用的选项.也许您的数据更接近多项模型mn:

nb = NaiveBayes.fit(training_data, target_class, 'Distribution', 'mn');
Run Code Online (Sandbox Code Playgroud)