在 MATLAB 中实现朴素贝叶斯算法 - 需要一些指导

Posted

技术标签:

【中文标题】在 MATLAB 中实现朴素贝叶斯算法 - 需要一些指导【英文标题】:Implementing Naïve Bayes algorithm in MATLAB - Need some guidance 【发布时间】:2012-01-07 02:08:48 【问题描述】:

我有一个需要在 MATLAB 中解决的二进制分类问题。有两个类,训练数据和测试数据问题来自两个类,它们是从高斯分布绘制的二维坐标。

样本是 2D 点,它们类似于以下内容(A 类为 1000 个样本,B 类为 1000 个样本): 我只是在这里发布其中的一些:

5.867766 3.843014 5.019520 2.874257 1.787476 4.483156 4.494783 3.551501 1.212243 5.949315 2.216728 4.126151 2.864502 3.139245 1.532942 6.669650 6.569531 5.032038 2.552391 5.753817 2.610070 4.251235 1.943493 4.326230 1.617939 4.948345

如果有新的测试数据进来,我应该如何对测试样本进行分类?

P(Class/TestPoint) 与 P(TestPoint/Class) * (ProbabilityOfClass) 成正比。

我不确定我们如何计算给定二维坐标的 P(Sample/Class) 变量。现在,我正在使用公式

P(Coordinates/Class) = (Coordinates-mean for that class) / standard deviation of points in that class).

但是,我没有得到很好的测试结果。我做错什么了吗?

【问题讨论】:

【参考方案1】:

这个方法不错,但是公式不正确,看multivariate gaussian distribution article on wikipedia:

P(测试点|类)= ,

其中 是 A 的行列式。

 Sigma = classPoint*classPoint';
 mu = mean(classPoint,2);
 proba = 1/((2*pi)^(2/2)*det(Sigma)^(1/2))*...
         exp(-1/2*(testPoint-mu)*inv(Sigma)*(testPoint-mu)');

在你的情况下,因为它们在两个类中的点数一样多,所以 P(class)=1/2

【讨论】:

训练样本如下:tinypic.com/r/nplvo0/5 大约有 2000 个训练样本(每个类别 1000 个)。我从每个类中选择 100 个随机样本,用它训练朴素贝叶斯分类器,并尝试预测其余的类标签。这是我得到的结果。 tinypic.com/view.php?pic=2j1n7f9&s=5 显然,我错了。我将尝试使用 Oli 发布的公式并将结果发布在这里。 tinypic.com/r/684lt4/5 这是我用公式看到的积分分类。非常感谢 :) 我不知道我是怎么错过的,我可以应用高斯分布的 pdf 来获得一个点属于一个类的概率。 误分类点大大减少。再次感谢您。 您图片上的结果似乎是正确的。我认为它现在正在工作。 我似乎无法投票,我是这里的新用户,它说我需要 15 个重新获得点 :(【参考方案2】:

假设您的公式应用正确,另一个问题可能是从您的数据点推导特征。您的问题可能不适合线性分类器。

【讨论】:

不是,他说这两个分布是高斯分布,这样的话,最优的分隔符是线性的。

以上是关于在 MATLAB 中实现朴素贝叶斯算法 - 需要一些指导的主要内容,如果未能解决你的问题,请参考以下文章

如何在贝叶斯网络中实现“异或”?

Matlab基于朴素贝叶斯算法实现多分类预测(源码可直接替换数据)

Matlab基于朴素贝叶斯算法实现多分类预测(源码可直接替换数据)

Matlab 朴素贝叶斯

Matlab基于朴素贝叶斯NB实现多分类预测(Excel可直接替换数据)

朴素贝叶斯分类器和判别分析的准确性还差得很远