数据挖掘(8):朴素贝叶斯分类算法原理与实践

合集下载

朴素贝叶斯参数调优

朴素贝叶斯参数调优

朴素贝叶斯参数调优全文共四篇示例,供读者参考第一篇示例:贝叶斯分类算法是一种常见的机器学习算法,它基于贝叶斯定理和特征之间的条件独立假设进行分类。

朴素贝叶斯算法简单、有效,并且在处理大规模数据集时表现良好。

朴素贝叶斯算法的性能很大程度上依赖于调整参数的合理性和合适性。

在本文中,我们将探讨朴素贝叶斯参数调优的重要性,并介绍一些常见的调优方法。

一、朴素贝叶斯算法简介朴素贝叶斯算法是一种基于概率的分类算法,它基于概率统计和特征之间的独立性假设来进行分类。

朴素贝叶斯算法通常用于文本分类、垃圾邮件检测、情感分析等应用场景中。

其基本假设是所有特征都是相互独立的,即给定类别的条件下,每个特征发生的概率是独立的。

朴素贝叶斯算法通过概率统计和条件概率来计算样本属于某个类别的概率,然后选择概率最大的类别作为预测结果。

二、朴素贝叶斯参数调优的重要性在实际应用中,朴素贝叶斯算法中的参数设置会直接影响算法的性能。

合理调优参数是提高算法性能的关键。

通过调优参数,我们可以使模型更符合我们数据集的特点,从而提高模型的准确性和泛化能力。

朴素贝叶斯算法中常见的参数包括平滑参数、特征选择方法、特征分布类型等。

1、平滑参数:平滑参数是朴素贝叶斯算法中的一个重要参数,用于解决训练数据中某个类别下某特征值的计数为零的问题。

常用的平滑参数包括拉普拉斯平滑、Lidstone平滑等。

通过调整平滑参数的大小,我们可以改变模型对数据的拟合程度,从而提高模型的泛化能力。

2、特征选择方法:特征选择方法是指在建立模型时选择哪些特征用于分类。

常见的特征选择方法包括信息增益、卡方检验、互信息等。

通过采用合适的特征选择方法,我们可以提高模型的准确性和效率。

3、特征分布类型:朴素贝叶斯算法假设特征之间是相互独立的,因此对特征的分布类型有一定的假设。

常见的特征分布类型包括高斯分布、多项式分布、伯努利分布等。

在实际应用中,我们可以根据数据集的特点选择合适的特征分布类型。

利用多项式分布朴素贝叶斯实现文本分类.

利用多项式分布朴素贝叶斯实现文本分类.

利用多项式分布朴素贝叶斯实现文本分类.
多项式分布朴素贝叶斯是一种常用的文本分类算法,它假设不同特征之间相互独立,并且特征的分布服从多项式分布。

具体实现步骤如下:
1. 数据预处理:对原始文本数据进行清洗、分词和去除停用词等处理。

2. 特征提取:根据需要选择适当的特征表示方法,常见的有词袋模型(Bag-of-Words)和TF-IDF等。

3. 特征向量化:将文本特征转换为数值向量,可以使用词向量表示方法(如Word2Vec、GloVe等)或者One-hot编码等。

4. 标签编码:将分类标签进行编码,通常使用One-hot编码或整数编码。

5. 训练模型:使用训练数据构建多项式分布朴素贝叶斯模型,并根据特征向量和标签训练模型参数。

6. 预测分类:使用训练好的模型对新的文本进行分类预测,计算每个类别的概率,并选择概率最大的类别作为预测结果。

需要注意的是,在实际应用中,除了多项式分布朴素贝叶斯,还有其他一些文本分类算法,如基于卷积神经网络(CNN)和循环神经网络(RNN)等。

具体选择哪种算法取决于数据集的特点和实际需求。

朴素贝叶斯算法公式

朴素贝叶斯算法公式

朴素贝叶斯算法公式朴素贝叶斯算法公式,听起来是不是有点让人头大?但别怕,咱们一起来把它弄明白。

先来说说什么是朴素贝叶斯算法。

这就好比我们在生活中做判断,根据以往的经验来猜测接下来会发生什么。

比如说,你发现每次下雨前天上都会有很多乌云,那下次看到满天乌云的时候,你就会猜可能要下雨啦。

朴素贝叶斯算法也是这个道理,它根据已知的数据和条件来推测未知的结果。

那朴素贝叶斯算法的公式到底是啥呢?咱们来看这个式子:P(C|X)= P(X|C) * P(C) / P(X) 。

别被这一串字母吓到,咱们一个一个来解释。

P(C) 呢,就像是你事先知道某个事情发生的可能性有多大。

比如说,在一个班级里,男生占 60%,女生占 40%,这就是 P(C) 。

P(X) 呢,就像是所有可能出现的情况。

比如说,一个盒子里有红、蓝、绿三种颜色的球,这就是 P(X) 。

P(X|C) 就有点意思啦。

还是拿班级举例,假如男生喜欢打篮球的概率是 80%,这就是 P(X|C) 。

最后说 P(C|X) ,这就是我们最终想要知道的结果。

比如说,看到一个人在打篮球,猜猜这个人是男生的概率有多大,这就是 P(C|X) 。

我记得之前有一次,我们学校组织了一场趣味数学竞赛。

题目就是让我们用朴素贝叶斯算法来推测某个结果。

当时我们小组拿到的题目是,根据同学们平时的阅读习惯来推测他们喜欢哪种类型的书籍。

我们先统计了大家平时读小说、传记、科普等不同类型书籍的频率,这就相当于算出了 P(C) 。

然后又观察了不同类型书籍的一些特点,比如小说情节丰富,传记比较真实等等,这就算是找出了 P(X|C) 。

最后通过公式计算,成功推测出了同学们对不同类型书籍的喜好概率。

总之,朴素贝叶斯算法公式虽然看起来有点复杂,但只要我们多去理解,多结合实际的例子,就能慢慢掌握它的精髓。

不管是在学习中还是生活里,它都能帮助我们做出更准确的判断和预测呢!。

基于EM的朴素贝叶斯分类算法

基于EM的朴素贝叶斯分类算法
第 25卷第 11期 2 0 1 0年 1 1月
宿 州学院学报 J ourna l of Suzhou Un iver sity
do i: 10. 3969 / j. issn. 1673 - 2006. 2010. 11. 005
Vol. 25, No. 11 Nov. 2010
基 于 EM 的 朴 素 贝 叶 斯 分 类 算 法
本文提出一种基于 EM 理论的朴素贝叶斯分类 器 ,首先用未缺失的数据属性的算术均数作为初始 值 ,求得极大似然估计 ;其次迭代执行算法的 E步和 M 步直至收敛 ,然后完成缺失数据的填补 ; 最后根据 朴素贝叶斯分类算法对填补后的数据进行分类。
1 朴素贝叶斯理论基础与 EM算法
1. 1 朴素贝叶斯分类 贝叶斯分类器的分类原理是通过某对象的先验
12
0 B2 ) + … + P (A 0 Bn ) P (Bn ) 称为全概率公式 。 定理 2 设试验 E的样本空间为 S, A为 E的事
件 , B1 , B2 , …, Bn 为的一个划分 , 则 P (B i 0 A) =
∑ P ( A 0 Bii ) P ( Bii ) / P (B | Aij ) P (Aij ) = P ( B |
张亚萍 , 陈得宝 , 侯俊钦
(淮北师范大学 物理与电子信息学院 ,安徽 淮北 235000)
摘要 :将 EM 算法引入到朴素贝叶斯分类研究中 ,提出一种基于 EM 的朴素贝叶斯分类算法 。首先用未缺失 的数据 属性的算术均数作为初始值 ,求得极大似然估计 ;其次迭代执行算法的 E步和 M 步直至收敛 ,然后完成缺失数据的 填补 ;最后根据朴素贝叶 斯分 类算 法对数据进行分类 。实验结果表明 ,与朴素贝 叶斯分类 算法相比 ,基于 EM 的朴 素贝叶斯分类算法具有较高的分类准确率 。 关键词 :朴素贝叶斯分类 ;先验概率 ;后 验概 率 ; EM 算法 ;缺失数据 中图分类号 : TP301. 6 文献标识码 : A 文章编号 : 1673 - 2006 ( 2010) 11 - 0012 - 03

朴素贝叶斯算法优缺点

朴素贝叶斯算法优缺点

朴素贝叶斯算法优缺点朴素贝叶斯算法是一种基于贝叶斯定理和特征独立假设的分类算法,被广泛应用于文本分类、垃圾邮件过滤、情感分析等领域。

它的主要优点包括简单高效、易于实现和可解释性强,但也存在一些缺点。

首先,朴素贝叶斯算法的优点之一是其简单高效。

相对于其他复杂的分类算法,朴素贝叶斯算法的计算复杂度较低,对于大规模数据集也能够快速进行训练和分类。

这使得朴素贝叶斯算法在实际应用中具有较高的实时性和可扩展性。

其次,朴素贝叶斯算法易于实现。

朴素贝叶斯算法基于简单的概率理论,算法的原理直观易懂。

在实现过程中,只需要计算先验概率和条件概率即可,而无需使用复杂的优化算法。

这使得朴素贝叶斯算法成为机器学习入门者学习和应用的良好选择。

另外,朴素贝叶斯算法具有较强的可解释性。

由于朴素贝叶斯算法基于概率理论,其分类结果可以通过概率值来解释。

这使得我们可以了解到每个特征对于分类结果的贡献程度,从而更好地理解数据的特点和分类的原因。

然而,朴素贝叶斯算法也存在一些缺点。

首先,朴素贝叶斯算法假设所有特征之间都是独立的,这在实际情况下并不总是成立。

当特征之间存在相关性时,朴素贝叶斯算法的分类效果会受到一定的影响。

其次,朴素贝叶斯算法对于输入数据的分布做了较强的假设,即特征的分布满足贝叶斯定理的条件。

然而,在实际应用中,数据往往不符合这种假设,这会导致朴素贝叶斯算法的分类效果下降。

此外,朴素贝叶斯算法对于缺失数据和连续数据处理不够灵活。

在处理缺失数据时,朴素贝叶斯算法通常使用简单的替代方法,如平均值或众数填充,可能会导致分类结果的偏差。

对于连续数据,朴素贝叶斯算法通常假设其服从特定的分布,而实际数据往往无法完全符合这种分布。

综上所述,朴素贝叶斯算法具有简单高效、易于实现和可解释性强的优点,但对于特征之间的相关性、数据分布的假设以及缺失和连续数据的处理存在一定的限制。

在实际应用中,我们需要针对具体问题选择合适的分类算法,综合考虑各种因素来进行决策。

朴素贝叶斯模型训练过程

朴素贝叶斯模型训练过程

朴素贝叶斯模型训练过程朴素贝叶斯模型是一种常用的分类算法,其训练过程包括数据预处理、特征提取、参数估计和模型评估几个关键步骤。

本文将详细介绍朴素贝叶斯模型的训练过程。

一、数据预处理在进行朴素贝叶斯模型训练之前,需要对原始数据进行预处理。

数据预处理的目标是将原始数据转化为模型能够处理的格式,并且保留有用的信息。

常见的数据预处理步骤包括数据清洗、数据集划分和特征选择等。

1. 数据清洗数据清洗是指对原始数据进行去除噪声、缺失值处理等操作,以保证数据的质量和完整性。

常见的数据清洗方法包括删除缺失值、处理异常值和重复值等。

2. 数据集划分数据集划分是将原始数据集划分为训练集和测试集两部分,用于模型的训练和评估。

通常将数据集按照一定比例划分,如常用的7:3或者8:2的比例。

3. 特征选择特征选择是从原始数据中选择出对分类有用的特征。

常见的特征选择方法包括过滤式特征选择、包裹式特征选择和嵌入式特征选择等。

二、特征提取特征提取是将原始数据转化为模型能够处理的特征向量。

朴素贝叶斯模型假设特征之间相互独立,因此需要对原始数据进行特征提取,将其转化为满足独立性假设的特征向量。

常见的特征提取方法包括词袋模型、TF-IDF模型和词向量模型等。

词袋模型将文本表示为词频向量,TF-IDF模型考虑了词频和文档频率,而词向量模型将每个词表示为一个向量。

三、参数估计参数估计是利用训练数据估计朴素贝叶斯模型中的参数。

在朴素贝叶斯模型中,参数估计包括先验概率的估计和条件概率的估计。

1. 先验概率的估计先验概率是指在没有任何证据的情况下,某个类别出现的概率。

在训练过程中,通过统计训练集中每个类别的样本数量,计算出每个类别的先验概率。

2. 条件概率的估计条件概率是指在已知某个类别的情况下,某个特征出现的概率。

在训练过程中,通过统计训练集中每个特征在每个类别下的样本数量,计算出每个特征在每个类别下的条件概率。

四、模型评估模型评估是对训练得到的朴素贝叶斯模型进行评估和调优。

大数据模型 算法

大数据模型 算法

大数据模型算法大数据模型算法导语:随着互联网和信息技术的迅猛发展,大数据成为了一种无法忽视的重要资源。

而在大数据分析中,模型算法则是实现数据挖掘和预测分析的关键技术。

本文将介绍几种常用的大数据模型算法,并探讨它们在实际应用中的价值和局限性。

一、K-means算法K-means算法是一种常用的聚类分析算法,它通过将数据集划分为K个簇来实现数据的分类和分组。

该算法的核心思想是通过计算数据点和簇中心点之间的距离来确定数据点的归属,从而实现聚类分析。

K-means算法具有简单、高效的优点,适用于大规模数据的处理。

然而,K-means算法对初始簇中心点的选择非常敏感,且对数据的分布和维度有一定的限制。

二、决策树算法决策树算法是一种常用的分类和回归分析算法,它通过构建一棵树形结构来实现数据的分类和预测。

决策树算法的优势在于直观、易于解释和理解,且可以处理具有高度非线性关系的数据。

然而,决策树算法容易过拟合,对于大规模数据的处理效率较低。

三、朴素贝叶斯算法朴素贝叶斯算法是一种常用的分类算法,它基于贝叶斯定理和特征条件独立假设来实现数据的分类。

朴素贝叶斯算法具有简单、高效的特点,尤其适用于文本分类和垃圾邮件过滤等应用场景。

然而,朴素贝叶斯算法忽略了特征之间的相关性,对于关联较强的数据处理效果较差。

四、支持向量机算法支持向量机算法是一种常用的分类和回归分析算法,它通过构建一个超平面来实现数据的分类和预测。

支持向量机算法具有良好的泛化性能和鲁棒性,适用于处理高维数据和非线性关系。

然而,支持向量机算法对于大规模数据的处理效率较低,且对参数的选择较为敏感。

五、神经网络算法神经网络算法是一种模拟人脑神经元工作方式的计算模型,它通过构建多层神经元网络来实现数据的分类和预测。

神经网络算法具有强大的非线性拟合能力和适应性,适用于处理复杂的大数据问题。

然而,神经网络算法的训练过程较为复杂,且对于数据量较小的情况下容易过拟合。

大数据模型算法在数据分析和预测中发挥着重要的作用。

朴素贝叶斯分类器的超参数调优方法

朴素贝叶斯分类器的超参数调优方法

朴素贝叶斯分类器的超参数调优方法朴素贝叶斯分类器是一种基于贝叶斯定理与特征条件独立假设的分类器,广泛应用于文本分类、垃圾邮件过滤等领域。

在实际应用中,选择合适的超参数对分类器的性能至关重要。

本文将探讨朴素贝叶斯分类器的超参数调优方法,帮助读者更好地应用这一经典的分类算法。

数据预处理在开始讨论超参数调优方法之前,我们需要先进行数据预处理。

这包括对数据进行清洗、特征提取等操作。

对于文本分类任务,通常需要进行分词、去停用词、词干提取等操作。

经过数据预处理后,我们得到了一份干净的、可以用于训练分类器的数据集。

超参数调优方法朴素贝叶斯分类器的性能受到多个超参数的影响,包括平滑参数(smoothing parameter)、特征选择方法等。

下面将介绍一些常用的超参数调优方法。

交叉验证交叉验证是一种常用的超参数调优方法。

它通过将数据集划分为训练集和验证集,并在验证集上评估分类器的性能。

通过不同的超参数组合进行交叉验证,最终选择性能最好的超参数组合。

在实际应用中,通常采用K折交叉验证(K-foldcross-validation)的方法,将数据集分为K份,依次选取其中一份作为验证集,其余K-1份作为训练集。

重复K次后,取平均性能作为最终评估结果。

网格搜索网格搜索是一种穷举搜索的方法,通过指定超参数的候选值,对所有可能的组合进行搜索,找到性能最好的超参数组合。

尽管这种方法在超参数空间较小的情况下效果较好,但是当超参数空间较大时,网格搜索的计算成本会变得非常高。

为了解决这个问题,可以使用随机搜索(Random Search)等方法进行替代。

贝叶斯优化贝叶斯优化是一种基于贝叶斯方法的超参数调优方法。

它通过建立超参数与性能之间的概率模型,来指导下一步的超参数选择。

在每一步中,贝叶斯优化会根据当前的模型性能,调整下一步的超参数选择。

相比于网格搜索等方法,贝叶斯优化在超参数空间较大时,具有更好的计算效率。

特征选择除了调整平滑参数等超参数外,特征选择也是影响朴素贝叶斯分类器性能的重要因素之一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据挖掘(8):朴素贝叶斯分类算法原理与实践 隔了很久没有写数据挖掘系列的文章了,今天介绍一下朴素贝叶斯分类算法,讲一下基本原理,再以文本分类实践。

一个简单的例子 朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下:

这个公式虽然看上去简单,但它却能总结历史,预知未来。公式的右边是总结历史,公式的左边是预知未来,如果把Y看出类别,X看出特征,P(Yk|X)就是在已知特征X的情况下求Yk类别的概率,而对P(Yk|X)的计算又全部转化到类别Yk的特征分布上来。

举个例子,大学的时候,某男生经常去图书室晚自习,发现他喜欢的那个女生也常去那个自习室,心中窃喜,于是每天买点好吃点在那个自习室蹲点等她来,可是人家女生不一定每天都来,眼看天气渐渐炎热,图书馆又不开空调,如果那个女生没有去自修室,该男生也就不去,每次男生鼓足勇气说:“嘿,你明天还来不?”,“啊,不知道,看情况”。然后该男生每天就把她去自习室与否以及一些其他情况做一下记录,用Y表示该女生是否去自习室,即Y={去,不去},X是跟去自修室有关联的一系列条件,比如当天上了哪门主课,蹲点统计了一段时间后,该男生打算今天不再蹲点,而是先预测一下她会不会去,现在已经知道了今天上了常微分方法这么主课,于是计算P(Y=去|常微分方程)与P(Y=不去|常微分方程),看哪个概率大,如果P(Y=去|常微分方程) >P(Y=不去|常微分方程),那这个男生不管多热都屁颠屁颠去自习室了,否则不就去自习室受罪了。P(Y=去|常微分方程)的计算可以转为计算以前她去的情况下,那天主课是常微分的概率P(常微分方程|Y=去),注意公式右边的分母对每个类别(去/不去)都是一样的,所以计算的时候忽略掉分母,这样虽然得到的概率值已经不再是0~1之间,但是其大小还是能选择类别。

后来他发现还有一些其他条件可以挖,比如当天星期几、当天的天气,以及上一次与她在自修室的气氛,统计了一段时间后,该男子一计算,发现不好算了,因为总结历史的公式:

这里n=3,x(1)表示主课,x(2)表示天气,x(3)表示星期几,x(4)表示气氛,Y仍然是{去,不去},现在主课有8门,天气有晴、雨、阴三种、气氛有A+,A,B+,B,C五种,那么总共需要估计的参数有8*3*7*5*2=1680个,每天只能收集到一条数据,那么等凑齐1680条数据大学都毕业了,男生打呼不妙,于是做了一个独立性假设,假设这些影响她去自习室的原因是独立互不相关的,于是

有了这个独立假设后,需要估计的参数就变为,(8+3+7+5)*2 = 46个了,而且每天收集的一条数据,可以提供4个参数,这样该男生就预测越来越准了。 朴素贝叶斯分类器 讲了上面的小故事,我们来朴素贝叶斯分类器的表示形式:

当特征为为x时,计算所有类别的条件概率,选取条件概率最大的类别作为待分类的类别。由于上公式的分母对每个类别都是一样的,因此计算时可以不考虑分母,即

朴素贝叶斯的朴素体现在其对各个条件的独立性假设上,加上独立假设后,大大减少了参数假设空间。

在文本分类上的应用 文本分类的应用很多,比如垃圾邮件和垃圾短信的过滤就是一个2分类问题,新闻分类、文本情感分析等都可以看成是文本分类问题,分类问题由两步组成:训练和预测,要建立一个分类模型,至少需要有一个训练数据集。贝叶斯模型可以很自然地应用到文本分类上:现在有一篇文档d(Document),判断它属于哪个类别ck,只需要计算文档d属于哪一个类别的概率最大: 在分类问题中,我们并不是把所有的特征都用上,对一篇文档d,我们只用其中的部分特征词项(nd表示d中的总词条数目),因为很多词项对分类是没有价值的,比如一些停用词“的,是,在”在每个类别中都会出现,这个词项还会模糊分类的决策面,关于特征词的选取,我的这篇文章有介绍。用特征词项表示文档后,计算文档d的类别转化为:

注意P(Ck|d)只是正比于后面那部分公式,完整的计算还有一个分母,但我们前面讨论了,对每个类别而已分母都是一样的,于是在我们只需要计算分子就能够进行分类了。实际的计算过程中,多个概率值P(tj|ck)的连乘很容易下溢出为0,因此转化为对数计算,连乘就变成了累加:

我们只需要从训练数据集中,计算每一个类别的出现概率P(ck)和每一个类别中各个特征词项的概率P(tj|ck),而这些概率值的计算都采用最大似然估计,说到底就是统计每个词在各个类别中出现的次数和各个类别的文档的数目: 其中,Nck表示训练集中ck类文档的数目,N训练集中文档总数;Tjk表示词项tj在类别ck中出现的次数,V是所有类别的词项集合。这里对词的位置作了独立性假设,即两个词只要它们出现的次数一样,那不管它们在文档的出现位置,它们大概率值P(tj|ck)都是一样,这个位置独立性假设与现实很不相符,比如“放马屁”跟“马放屁”表述的是不同的内容,但实践发现,位置独立性假设得到的模型准确率并不低,因为大多数文本分类都是靠词的差异来区分,而不是词的位置,如果考虑词的位置,那么问题将表达相当复杂,以至于我们无从下手。

然后需要注意的一个问题是ti可能没有出现在ck类别的训练集,却出现在ck类别的测试集合中,这样因为Tik为0,导致连乘概率值都为0,其他特征词出现得再多,该文档也不会被分到ck类别,而且在对数累加的情况下,0值导致计算错误,处理这种问题的方法是采样加1平滑,即认为每个词在各个类别中都至少出现过一次,即

下面这个例子来自于参考文献1,假设有如下的训练集合测试集: 现在要计算docID为5的测试文档是否属于China类别,首先计算个各类的概率,P(c=China)=3/4,P(c!=China)=1/4,然后计算各个类中词项的概率:

注意分母(8+6)中8表示China类的词项出现的总次数是8,+6表示平滑,6是总词项的个数,然后计算测试文档属于各个类别的概率:

可以看出该测试文档应该属于CHina类别。 文本分类实践 我找了搜狗的搜狐新闻数据的历史简洁版,总共包括汽车、财经、it、健康等9类新闻,一共16289条新闻,搜狗给的数据是每一篇新闻用一个txt文件保存,我预处理了一下,把所有的新闻文档保存在一个文本文件中,每一行是一篇新闻,同时保留新闻的id,id的首字母表示类标,预处理并分词后的示例如下: 我用6289条新闻作为训练集,剩余1万条用于测试,采用互信息进行文本特征的提取,总共提取的特征词是700个左右。

分类的结果如下: 1 8343100000.8343 总共10000条新闻,分类正确的8343条,正确率0.8343,这里主要是演示贝叶斯的

分类过程,只考虑了正确率也没有考虑其他评价指标,也没有进行优化。贝叶斯分类的效率高,训练时,只需要扫描一遍训练集,记录每个词出现的次数,以及各类文档出现的次数,测试时也只需要扫描一次测试集,从运行效率这个角度而言,朴素贝叶斯的效率是最高的,而准确率也能达到一个理想的效果。

我的实现代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 #!encoding=utf-8 importrandom importsys importmath importcollections importsys defshuffle(): '''将原来的文本打乱顺序,用于得到训练集和测试集''' datas =[line.strip() forline insys.stdin] random.shuffle(datas) forline indatas: printline 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

lables =['A','B','C','D','E','F','G','H','I'] deflable2id(lable): fori inxrange(len(lables)): iflable ==lables[i]: returni raiseException('Error lable %s'%(lable))

defdocdict(): return[0]*len(lables)

defmutalInfo(N,Nij,Ni_,N_j): #print N,Nij,Ni_,N_j returnNij *1.0/N *math.log(N *(Nij+1)*1.0/(Ni_*N_j))/math.log(2)

defcountForMI(): '''基于统计每个词在每个类别出现的次数,以及每类的文档数''' docCount =[0] *len(lables)#每个类的词数目 wordCount =collections.defaultdict(docdict) forline insys.stdin: lable,text =line.strip().split(' ',1) index =lable2id(lable[0]) words =text.split(' ') forword inwords: wordCount[word][index] +=1 docCount[index] +=1

miDict =collections.defaultdict(docdict)#互信息值 N =sum(docCount) fork,vs inwordCount.items(): fori inxrange(len(vs)): N11 =vs[i] N10 =sum(vs) -N11 N01 =docCount[i] -N11 N00 =N -N11 -N10 -N01 mi =mutalInfo(N,N11,N10+N11,N01+N11) +mutalInfo(N,N10,N10+N11,N00+N10)+mutalInfo(N,N01,N01+N11,N01+N00)+mutalInfo(N,N00,N00+N10,N00+N01) miDict[k][i] =mi fWords =set() fori inxrange(len(docCount)): keyf =lambdax:x[1][i] sortedDict =sorted(miDict.items(),key=keyf,reverse=True)

相关文档
最新文档