# bayes **Repository Path**: iOceanPlus_Research/bayes ## Basic Information - **Project Name**: bayes - **Description**: 朴素贝叶斯算法在Python2.7上的实现与应用 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-02-23 - **Last Updated**: 2022-02-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #bayes 《机器学习实战》第四章朴素贝叶斯,在自己实现时遇到的问题,在此总结记录。 问题一:垃圾邮件测试函数,在读取文件时报错,UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 199: illegal multibyte sequence ``` wordList = textParse(open('email/ham/%d.txt' % i).read()) ``` 问题原因:文件'email/ham/23.txt'中有一个字符无法被解析。 解决办法:在第二行中有一个问号,将其替换为空格后,问题便解决了。 问题二:垃圾邮件测试函数,在构建训练集和测试集的时候报错,NameError: name 'random' is not defined ``` randIndex = int(random.uniform(0,len(trainingSet))) ``` 问题原因:没有import random 解决办法:在spamTest()函数中添加一行“import random”即可。 问题二追加报错:当解决错误“NameError: name 'random' is not defined”后,又会生成另一个错误,TypeError: 'range' object doesn't support item deletion 问题原因:该问题是由于python2.7.12和经典python2.7之间的区别。python2.7.12的语法接近python3,在python2.7中,range(50)返回的是0到49的列表,而在在python3中,range(50)返回的是range(0, 50),因此导致了后续代码del(trainingSet[randIndex])发生错误。 解决办法:将代码trainingSet = range(50)改为trainingSet = list(range(50)) ### **朴素贝叶斯** ``` # 举例:词向量计算概率伪代码如下 计算每个类别中的文档数目 对每篇训练文档: 对每个类别: 如果词条出现在文档中: 增加该词条的计数值 增加所有词条的计数值 对每个类别: 对每个词条: 将该词条的数目初一总词条数目得到条件概率 返回每个类别的条件概率 ``` - 优点:在数据较少的情况下仍然有效,可以处理多类别问题。 - 缺点:对于输入数据的准备方式比较敏感。 - 适用数据类型:标称型数据。 ### **朴素贝叶斯的一般过程** 1. 收集数据:可以使用任何方法。 2. 准备数据:需要数值型或者布尔型数据。 3. 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好。 4. 训练算法:计算不同的独立特征的条件概率。 5. 测试方法:计算错误率。 6. 使用方法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。 ### **示例:使用朴素贝叶斯对电子邮件进行分类** 1. 收集数据:提供文本文件。 2. 准备数据:将文本文件解析成词条向量。 3. 分析数据:检查词条确保解析的正确性。 4. 训练算法:使用bayes.py中建立的trainNB0()函数。 5. 测试方法:使用classifyNB(),并且构建一个新的测试函数来计算文档的错误率。 6. 使用算法:构建一个完整的程序对一组文档进行分类,将错误的文档输出到屏幕上。 **email文档数据说明:文件夹ham中的文档为正常邮件,文件夹spam中的文档为垃圾邮件。**