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

7
作为一项学校作业,我需要在Java中实现朴素贝叶斯算法。
在尝试理解如何实现它时,我读了一本名为“数据挖掘 - 实用机器学习工具和技术”的书,其中有一节关于这个主题,但我仍然不确定一些主要点,这些点阻碍了我的进展。
因为我在这里寻求指导而非解决方案,所以我将告诉大家我在脑海中的想法,我认为是正确的方法,并寻求纠正/指导,这将非常感激。请注意,我是一个绝对的初学者,在朴素贝叶斯算法、数据挖掘和一般编程方面,所以你可能会看到下面愚蠢的评论/计算:
我得到的训练数据集有4个数值和规范化的属性/特征(在[0 1]范围内使用Weka),并且有一个名义类(是/否)。
1)来自csv文件的数据是数值型的,所以
* 给定属性是数值型的,我使用PDF(概率密度函数)公式。 * 要在Java中计算PDF,我首先根据它们是否在yes或no类中将属性分开,并将它们保存到不同的数组中(数组yes和数组no)。 * 然后计算每个类的4个属性(列)的平均值(行中值的总和/该行中的值数)和标准差。 * 现在要找到给定值(n)的PDF,我做的是(n-mean)^2/(2 * SD ^ 2)。 * 然后要找到P(yes | E)和P(no | E),我将所有4个给定属性的PDF值相乘并比较哪个更大,这表明它属于哪个类。
在Java方面,我使用ArrayList of ArrayList和Double来存储属性值。
最后,我不确定如何获取新数据?我应该请求输入文件(如csv)还是命令提示符并请求4个值?
我现在就停在这里(还有更多问题),但我担心这不会得到任何回应,因为它太长了。对于那些花时间阅读我的问题和评论的人,我会非常感激。

我将如何实现算法的概述听起来正确吗? - ke3pup
1个回答

5
你所做的几乎是正确的。
         + Then to find P( yes | E) and P( no | E) i multiply the PDF value of all 4 given attributes and compare which is larger, which indicates the class it belongs to 

在这里,您忘记了乘以先验概率 P(yes) 或 P(no)。请记住决策公式:

P(Yes | E) ~= P(Attr_1 | Yes) * P(Attr_2 | Yes) * P(Attr_3 | Yes) * P(Attr_4 | Yes) * P(Yes)

对于朴素贝叶斯(以及任何其他监督学习/分类算法),您需要有训练数据和测试数据。您使用训练数据来训练模型并在测试数据上进行预测。您可以简单地将训练数据用作测试数据。或者,您可以将csv文件分成两个部分,一个用于训练,一个用于测试。您还可以对csv文件进行交叉验证。


如果可能的话,一定要使用交叉验证。如果可以避免,绝不要在训练数据上进行测试。 - Shaggy Frog
@Shaggy,对训练数据进行测试是一种选择,也是针对新数据集或新实现分类器的必要步骤。它可以告诉你优化的效果如何。如果一个分类器在训练数据上表现不佳,那么这个分类器就不能用于该数据集。同时,在编写分类器时,训练数据的性能也可以用于诊断目的。 - Yin Zhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接