朴素贝叶斯分类器
- 格式:doc
- 大小:255.00 KB
- 文档页数:9
常用nlp算法NLP(自然语言处理)是计算机科学和人工智能领域的一个重要分支,其主要目的是让计算机能够理解、分析和生成人类语言。
在NLP中,有许多常用的算法,本文将对其中一些进行详细介绍。
一、文本分类算法1. 朴素贝叶斯分类器朴素贝叶斯分类器是一种基于概率统计的分类算法,它假设所有特征都是相互独立的,并且每个特征对结果的影响是相同的。
在文本分类中,每个单词可以看作一个特征,而文本可以看作一个包含多个特征的向量。
朴素贝叶斯分类器通过计算每个类别下每个单词出现的概率来确定文本所属类别。
2. 支持向量机(SVM)SVM是一种常用的二分类算法,在文本分类中也有广泛应用。
它通过找到一个最优超平面来将不同类别的数据分开。
在文本分类中,可以将每个单词看作一个维度,并将所有文本表示为一个高维向量。
SVM通过最大化不同类别之间的间隔来确定最优超平面。
3. 决策树决策树是一种基于树形结构的分类算法,它通过对数据进行逐步划分来确定每个数据点所属的类别。
在文本分类中,可以将每个单词看作一个特征,并将所有文本表示为一个包含多个特征的向量。
决策树通过逐步划分特征来确定文本所属类别。
二、情感分析算法1. 情感词典情感词典是一种包含大量单词及其情感极性的词典,它可以用来对文本进行情感分析。
在情感词典中,每个单词都被标注为积极、消极或中性。
在进行情感分析时,可以统计文本中出现积极和消极单词的数量,并计算出总体情感倾向。
2. 深度学习模型深度学习模型是一种基于神经网络的模型,它可以自动从数据中学习特征并进行分类或回归。
在情感分析中,可以使用卷积神经网络(CNN)或长短期记忆网络(LSTM)等深度学习模型来对文本进行分类。
三、实体识别算法1. 基于规则的方法基于规则的方法是一种手工编写规则来进行实体识别的方法。
在这种方法中,可以通过正则表达式或其他模式匹配算法来识别特定类型的实体。
例如,在医疗领域中,可以通过匹配特定的病症名称或药品名称来识别实体。
朴素贝叶斯分类器详解及中⽂⽂本舆情分析(附代码实践)本⽂主要讲述朴素贝叶斯分类算法并实现中⽂数据集的舆情分析案例,希望这篇⽂章对⼤家有所帮助,提供些思路。
内容包括:1.朴素贝叶斯数学原理知识2.naive_bayes⽤法及简单案例3.中⽂⽂本数据集预处理4.朴素贝叶斯中⽂⽂本舆情分析本篇⽂章为基础性⽂章,希望对你有所帮助,如果⽂章中存在错误或不⾜之处,还请海涵。
同时,推荐⼤家阅读我以前的⽂章了解基础知识。
▌⼀. 朴素贝叶斯数学原理知识朴素贝叶斯(Naive Bayesian)是基于贝叶斯定理和特征条件独⽴假设的分类⽅法,它通过特征计算分类的概率,选取概率⼤的情况,是基于概率论的⼀种机器学习分类(监督学习)⽅法,被⼴泛应⽤于情感分类领域的分类器。
下⾯简单回顾下概率论知识:1.什么是基于概率论的⽅法?通过概率来衡量事件发⽣的可能性。
概率论和统计学是两个相反的概念,统计学是抽取部分样本统计来估算总体情况,⽽概率论是通过总体情况来估计单个事件或部分事情的发⽣情况。
概率论需要已知数据去预测未知的事件。
例如,我们看到天⽓乌云密布,电闪雷鸣并阵阵狂风,在这样的天⽓特征(F)下,我们推断下⾬的概率⽐不下⾬的概率⼤,也就是p(下⾬)>p(不下⾬),所以认为待会⼉会下⾬,这个从经验上看对概率进⾏判断。
⽽⽓象局通过多年长期积累的数据,经过计算,今天下⾬的概率p(下⾬)=85%、p(不下⾬)=15%,同样的 p(下⾬)>p(不下⾬),因此今天的天⽓预报肯定预报下⾬。
这是通过⼀定的⽅法计算概率从⽽对下⾬事件进⾏判断。
2.条件概率若Ω是全集,A、B是其中的事件(⼦集),P表⽰事件发⽣的概率,则条件概率表⽰某个事件发⽣时另⼀个事件发⽣的概率。
假设事件B发⽣后事件A发⽣的概率为:设P(A)>0,则有 P(AB) = P(B|A)P(A) = P(A|B)P(B)。
设A、B、C为事件,且P(AB)>0,则有 P(ABC) = P(A)P(B|A)P(C|AB)。
朴素贝叶斯分类器是一种基于贝叶斯定理和特征条件独立假设的分类方法。
以下是一个简单的例子来说明朴素贝叶斯分类器的工作原理。
假设我们有一个数据集,其中包含两个类别:感冒和过敏,以及两个特征:打喷嚏和职业。
根据先验概率,我们知道感冒的概率为0.5,过敏的概率为0.33。
现在,我们要根据一个人的特征和职业来预测他是否患有感冒或过敏。
首先,我们来看第一个特征“打喷嚏”。
如果一个打喷嚏的人是建筑工人,我们假设“打喷嚏”和“建筑工人”这两个特征是独立的,因此可以使用朴素贝叶斯公式来计算他患感冒的概率。
具体地,我们可以使用以下公式:
P(感冒|打喷嚏x建筑工人) = P(打喷嚏|感冒) x P(建筑工人|感冒) x P(感冒) / P(打喷嚏x建筑工人)
根据已知条件,我们可以将上述公式中的各个概率值代入计算,得到该建筑工人患感冒的概率为0.66。
同样地,我们可以使用朴素贝叶斯公式来计算该建筑工人患过敏的概率,具体公式为:
P(过敏|打喷嚏x建筑工人) = P(打喷嚏|过敏) x P(建筑工人|过敏) x P(过敏) / P(打喷嚏x建筑工人)
代入已知条件计算后,得到该建筑工人患过敏的概率为0.34。
因此,根据朴素贝叶斯分类器的判断,该建筑工人更有可能患有感冒。
以上就是一个简单的朴素贝叶斯分类器的例子。
需要注意的是,在实际应用中,数据集通常包含更多的特征和类别,计算也会更加复杂。
粗糙集理论与朴素贝叶斯分类器的比较与融合引言:在机器学习和数据挖掘领域,分类器是一种常用的工具,用于将数据集中的实例分配到不同的类别中。
粗糙集理论和朴素贝叶斯分类器是两种常见的分类方法,本文将对它们进行比较与融合,探讨它们的优势和适用场景。
一、粗糙集理论粗糙集理论是由波兰学者Pawlak于1982年提出的一种基于粗糙度的不确定性处理方法。
该理论将数据集分为决策属性和条件属性,通过计算属性间的粗糙度来实现分类。
粗糙集理论的优势在于能够处理不完整和不确定的数据,具有较强的鲁棒性。
二、朴素贝叶斯分类器朴素贝叶斯分类器是一种基于贝叶斯定理和特征条件独立性假设的分类方法。
该分类器通过计算给定特征条件下各类别的后验概率来进行分类。
朴素贝叶斯分类器的优势在于简单快速,对于大规模数据集具有较好的性能。
三、比较与融合粗糙集理论和朴素贝叶斯分类器在分类问题上有着不同的特点和适用场景。
粗糙集理论适用于处理不完整和不确定的数据,能够在数据缺失或噪声较多的情况下仍然有效。
而朴素贝叶斯分类器适用于处理大规模数据集,具有较好的性能和计算效率。
在实际应用中,可以将粗糙集理论和朴素贝叶斯分类器进行融合,充分利用它们各自的优势。
首先,可以使用粗糙集理论对数据进行预处理,处理不完整和不确定的数据,将其转化为可用的形式。
然后,将处理后的数据输入到朴素贝叶斯分类器中进行分类。
这样可以充分利用粗糙集理论的鲁棒性和朴素贝叶斯分类器的性能。
融合粗糙集理论和朴素贝叶斯分类器的方法有多种,可以根据具体问题选择合适的方法。
一种常见的方法是将粗糙集理论和朴素贝叶斯分类器作为两个独立的模块,分别进行数据预处理和分类,最后将它们的结果进行融合。
另一种方法是将粗糙集理论的粗糙度作为朴素贝叶斯分类器的先验概率,通过联合计算得到更准确的分类结果。
融合粗糙集理论和朴素贝叶斯分类器可以提高分类的准确性和鲁棒性,适用于处理复杂的实际问题。
在实际应用中,可以根据具体情况选择合适的方法和参数,进行优化和调整。
朴素贝叶斯分类器的超参数调优方法朴素贝叶斯分类器是一种基于概率和统计的分类方法,它假设各个特征之间是相互独立的。
在实际应用中,朴素贝叶斯分类器经常被用来处理文本分类等问题,但是在处理实际数据时,我们常常需要对分类器的超参数进行调优,以提高分类器的性能。
本文将介绍朴素贝叶斯分类器的超参数调优方法。
首先,我们需要了解朴素贝叶斯分类器的超参数。
朴素贝叶斯分类器有两个主要的超参数需要调优,分别是平滑参数和特征选择参数。
平滑参数是朴素贝叶斯分类器中的一个重要参数,它用来处理在训练数据中某些类别或特征的概率为零的情况。
常见的平滑参数包括拉普拉斯平滑和Lidstone平滑。
在实际应用中,我们需要通过交叉验证等方法来选择最适合的平滑参数。
特征选择参数是指在朴素贝叶斯分类器中选择哪些特征进行分类的参数。
在实际应用中,我们可能面对大量的特征,而其中只有一部分是对分类有用的。
因此,我们需要通过特征选择方法来选择最优的特征。
接下来,我们将介绍朴素贝叶斯分类器的超参数调优方法。
对于平滑参数的调优,我们可以通过网格搜索或者随机搜索的方法来选择最优的平滑参数。
网格搜索是一种穷举搜索的方法,它将所有可能的参数组合都尝试一遍,然后选择最优的参数组合。
而随机搜索则是通过随机地选择参数组合来进行搜索,一般来说,随机搜索可以在相对短的时间内找到较好的参数组合。
对于特征选择参数的调优,我们可以采用一些常见的特征选择方法,比如方差过滤、相关性过滤、互信息过滤等。
这些方法可以帮助我们在保留最重要的特征的同时,去除一些无用的特征,从而提高分类器的性能。
除了上述方法外,我们还可以尝试使用贝叶斯优化等方法来进行超参数的调优。
贝叶斯优化是一种基于贝叶斯理论的超参数优化方法,它通过不断地更新对参数的后验分布来选择最优的参数组合。
与网格搜索和随机搜索相比,贝叶斯优化在高维参数空间中的效果更好。
最后,我们需要注意的是,朴素贝叶斯分类器的超参数调优并不是一次性的事情,我们需要通过实验和不断地调整参数来寻找最优的参数组合。
利用机器学习技术进行文本分类的方法文本分类是指将一段文本划分到特定的类别或标签中的任务。
随着互联网的发展,人们需要处理大量的文本数据,因此自动文本分类成为一个重要的研究课题。
而利用机器学习技术进行文本分类的方法受到广泛的关注和应用。
在本文中,我们将介绍几种常用的机器学习技术,并分析它们在文本分类中的应用和效果。
一、朴素贝叶斯分类器朴素贝叶斯分类器是一种基于概率统计原理的分类方法。
它假设特征之间是相互独立的,并利用贝叶斯定理进行分类。
在文本分类中,朴素贝叶斯分类器通常使用词袋模型表示文本,将文本转换为向量形式进行计算。
通过计算每个类别下各个词的条件概率,来判断文本属于哪个类别。
朴素贝叶斯分类器在处理大规模文本数据时具有快速训练和预测的优势,在一些简单的文本分类任务中表现良好。
二、支持向量机(SVM)支持向量机是一种二分类模型,通过构造最优超平面来实现分类。
在文本分类中,支持向量机可以将文本数据映射到高维空间中,并尽可能找到一个超平面,使得不同类别数据的间隔最大化。
支持向量机在文本分类中常使用TF-IDF表示文本特征,通过选择合适的核函数(如线性核、多项式核或高斯核)来建模文本间的相似性。
支持向量机在处理文本分类问题上的表现被广泛认为是一种稳定且有效的方法。
三、深度学习模型近年来,深度学习方法在文本分类任务中取得了很好的效果。
深度学习模型通过多层神经网络的组合,能够自动从原始文本数据中学习到复杂的特征表示。
其中,卷积神经网络(CNN)和循环神经网络(RNN)是常用的深度学习模型。
CNN主要用于文本局部特征的提取,而RNN则可以捕捉到文本中的时序信息。
此外,可以使用预训练的词向量(如Word2Vec或GloVe)来初始化神经网络的词嵌入层,进一步提高分类性能。
深度学习模型对于大规模文本数据的处理能力强大,但也需要更多的计算资源和数据量来支持训练,并且在参数调整和算法优化上相对复杂一些。
四、集成学习方法集成学习方法是通过组合多个分类器,以增强分类性能的方式。
朴素贝叶斯分类器的超参数调优方法朴素贝叶斯分类器是一种基于贝叶斯定理与特征条件独立假设的分类器,广泛应用于文本分类、垃圾邮件过滤等领域。
在实际应用中,选择合适的超参数对分类器的性能至关重要。
本文将探讨朴素贝叶斯分类器的超参数调优方法,帮助读者更好地应用这一经典的分类算法。
数据预处理在开始讨论超参数调优方法之前,我们需要先进行数据预处理。
这包括对数据进行清洗、特征提取等操作。
对于文本分类任务,通常需要进行分词、去停用词、词干提取等操作。
经过数据预处理后,我们得到了一份干净的、可以用于训练分类器的数据集。
超参数调优方法朴素贝叶斯分类器的性能受到多个超参数的影响,包括平滑参数(smoothing parameter)、特征选择方法等。
下面将介绍一些常用的超参数调优方法。
交叉验证交叉验证是一种常用的超参数调优方法。
它通过将数据集划分为训练集和验证集,并在验证集上评估分类器的性能。
通过不同的超参数组合进行交叉验证,最终选择性能最好的超参数组合。
在实际应用中,通常采用K折交叉验证(K-foldcross-validation)的方法,将数据集分为K份,依次选取其中一份作为验证集,其余K-1份作为训练集。
重复K次后,取平均性能作为最终评估结果。
网格搜索网格搜索是一种穷举搜索的方法,通过指定超参数的候选值,对所有可能的组合进行搜索,找到性能最好的超参数组合。
尽管这种方法在超参数空间较小的情况下效果较好,但是当超参数空间较大时,网格搜索的计算成本会变得非常高。
为了解决这个问题,可以使用随机搜索(Random Search)等方法进行替代。
贝叶斯优化贝叶斯优化是一种基于贝叶斯方法的超参数调优方法。
它通过建立超参数与性能之间的概率模型,来指导下一步的超参数选择。
在每一步中,贝叶斯优化会根据当前的模型性能,调整下一步的超参数选择。
相比于网格搜索等方法,贝叶斯优化在超参数空间较大时,具有更好的计算效率。
特征选择除了调整平滑参数等超参数外,特征选择也是影响朴素贝叶斯分类器性能的重要因素之一。
朴素贝叶斯分类器的基本原理朴素贝叶斯分类器是一种常用的统计学习方法。
它基于贝叶斯定理与特征条件独立性假设,通过训练数据构建概率模型,用于分类预测。
1. 贝叶斯定理朴素贝叶斯分类器的核心是贝叶斯定理。
贝叶斯定理是概率论中的重要定理,描述了条件概率之间的关系。
给定事件A和B,其中B发生的情况下,A发生的概率可以通过条件概率P(A|B)计算得出,而贝叶斯定理则是通过反转条件概率计算出未知条件的概率。
贝叶斯定理的公式如下:P(A|B) = P(B|A) * P(A) / P(B)其中,P(A|B)表示在事件B发生的情况下事件A发生的概率,P(B|A)表示在事件A 发生的情况下事件B发生的概率,P(A)和P(B)分别表示事件A和事件B的先验概率。
2. 朴素贝叶斯分类器的假设朴素贝叶斯分类器基于特征条件独立性假设,即假设所有特征在给定类别的情况下是相互独立的。
这个假设使得朴素贝叶斯分类器能够使用较少的训练数据来估计每个特征的条件概率,并且简化了计算过程。
3. 朴素贝叶斯分类器的训练过程朴素贝叶斯分类器的训练过程可以分为以下几个步骤:•收集样本数据:首先需要收集一定数量的已知分类的样本数据,这些样本数据由特征和对应的类别标签组成。
•特征选择与表示:选择合适的特征对样本进行表示,常见的特征表示方法包括词袋模型、TF-IDF等。
•学习类别的先验概率:计算每个类别在样本数据中的出现频率,作为类别的先验概率。
•学习特征的条件概率:对于每个特征,计算在给定类别的情况下,该特征取每个可能值的概率。
•构建分类模型:使用先验概率和条件概率构建朴素贝叶斯分类模型。
4. 朴素贝叶斯分类器的预测过程朴素贝叶斯分类器的预测过程可以分为以下几个步骤:•输入待预测样本:将待预测样本表示为特征向量。
•计算类别的后验概率:对于每个类别,计算在给定特征的情况下,该类别的概率。
根据贝叶斯定理公式,后验概率可以通过先验概率和条件概率相乘得到。
•选择最大后验概率类别:选择后验概率最大的类别作为预测结果。
朴素贝叶斯分类器Naive Bayesian ClassifierC语言实现信息电气工程学院计算本1102班20112212465马振磊1.贝叶斯公式通过贝叶斯公式,我们可以的知在属性F1-Fn成立的情况下,该样本属于分类C的概率。
而概率越大,说明样本属于分类C的可能性越大。
若某样本可以分为2种分类A,B。
要比较P(A | F1,F2......) 与P(B | F1,F2......)的大小只需比较,P(A)P(F1,F2......| A) ,与P(B)P(F1,F2......| B) 。
因为两式分母一致。
而P(A)P(F1,F2......| A)可以采用缩放为P(A)P(F1|A)P(F2|A).......(Fn|A)因此,在分类时,只需比较每个属性在分类下的概率累乘,再乘该分类的概率即可。
分类属性outlook 属性temperature 属性humidity 属性wind no sunny hot high weakno sunny hot high strongyes overcast hot high weakyes rain mild high weakyes rain cool normal weakno rain cool normal strongyes overcast cool normal strongno sunny mild high weakyes sunny cool normal weakyes rain mild normal weakyes sunny mild normal strongyes overcast mild high strongyes overcast hot normal weakno rain mild high strong以上是根据天气的4种属性,某人外出活动的记录。
若要根据以上信息判断(Outlook = sunny,Temprature = cool,Humidity = high,Wind = strong)所属分类。
P(yes| sunny ,cool ,high ,strong )=P(yes)P(sunny|yes)P(cool |yes)P(high|yes)P(strong|yes)/KP(no| sunny ,cool ,high ,strong )=P(no)P(sunny|no)P(cool |no)P(high|no)P(strong|no)/KK为缩放因子,我们只需要知道两个概率哪个大,所以可以忽略K。
P(yes)=9/14 P(no)=5/14P(sunny|yes)=2/9 P(cool|yes)=1/3 P(high|yes)=1/3 P(strong|yes)=1/3P(sunny|no)=3/5 P(cool|no)=1/5 P(high|no)=4/5 P(strong|no)=3/5P(yes| sunny ,cool ,high ,strong)=9/14*2/9*1/3*1/3*1/3=0.00529P(no| sunny ,cool ,high ,strong )=5/14*3/5*1/5*4/5*3/5=0.20571No的概率大,所以该样本实例属于no分类。
2.数据结构及代码实现1.属性及分类我们限定分类器的属性不大于9个,每个属性拥有不大于9个值。
于是,我们考虑采用一个9 X 9的表格存储属性及其值。
属性1 值1 值2 值3 值4 值5 值6 值7 值8 值9属性2 值1 值2 值3 值4 值5 值6 值7 值8 值9属性3 值1 值2 值3 值4 值5 值6 值7 值8 值9属性4 值1 值2 值3 值4 值5 值6 值7 值8 值9属性5 值1 值2 值3 值4 值5 值6 值7 值8 值9属性6 值1 值2 值3 值4 值5 值6 值7 值8 值9属性7 值1 值2 值3 值4 值5 值6 值7 值8 值9属性8 值1 值2 值3 值4 值5 值6 值7 值8 值9属性9 值1 值2 值3 值4 值5 值6 值7 值8 值9为了调用数据方便,我们把数据从第一行开始储存。
为了充分利用存储空间,我们把第零行储存分类数据。
分类1 分类2 分类3 分类4 分类5 分类6 分类7 分类8 分类9属性1 值1 值2 值3 值4 值5 值6 值7 值8 值9属性2 值1 值2 值3 值4 值5 值6 值7 值8 值9属性3 值1 值2 值3 值4 值5 值6 值7 值8 值9属性4 值1 值2 值3 值4 值5 值6 值7 值8 值9属性5 值1 值2 值3 值4 值5 值6 值7 值8 值9属性6 值1 值2 值3 值4 值5 值6 值7 值8 值9属性7 值1 值2 值3 值4 值5 值6 值7 值8 值9属性8 值1 值2 值3 值4 值5 值6 值7 值8 值9属性9 值1 值2 值3 值4 值5 值6 值7 值8 值9现在,我们可以采用一个10 X 10 的表格来储存数据了。
而每个单元格的内容需要占用一定的储存空间,我们可以用一个三维数组char feature[10][10][10]来表示这种结构的数据。
用来容纳9个属性的9个值。
第0行,我们用来储存分类数据。
而第一行的第一列没有被使用,而其中含有10个char类型的数据我们可以用它来储存属性值的多少。
如图:分类的个数属性1值的个数属性2值的个数........... 属性9值的个数前一段的数据:分类:yes no属性outlook :sunny overcast rain属性temperature:hot mild cool属性humidity:high normal属性wind:strong weak如下图yes nooutlook sunny overcast rainTempera hot mild coolhumidity high normalwind strong weak第0行,第0列2 3 3 2 2代码如下:int x=1,y;printf("请输入属性名称(小于9个字符):");gets(feature[x][0]);printf("该属性有几种值(不多于9个值):");scanf("%c",&feature[0][0][x]); //把属性值储存入feature[0][0][x];feature[0][0][x]-=48; //feature[0][0][x]是由字符格式输入的-48变为数字getchar();system("cls");for(y=1;y<=feature[0][0][x];y++) //根据feature[0][0][x]循环输入,将属性的值存入数组{printf("请输入第%d个值:",y);gets(feature[x][y]);}x++;通过这段代码的循环,输入属性及其值进入feature数组。
通过以下代码将分类数据存入数组第0行。
printf("该事物可以被分为几种类别:");scanf("%c",&feature[0][0][0]); //分类数目存入feature[0][0][0]feature[0][0][0]-=48;getchar();system("cls");for(y=1;y<=feature[0][0][0];y++) //通过循环将分类存入第0行{printf("请输入第%d种类别的名称:",y);gets(feature[0][y]);}2.训练样本每个训练样本的属性最多有9个值,再加上分类一个值,所以,我们采用一个10列的表格储存训练样本数据。
no sunny hot high weakno sunny hot high strongyes overcast hot high weakyes rain mild high weakyes rain cool normal weakno rain cool normal strongyes overcast cool normal strongno sunny mild high weakyes sunny cool normal weakyes rain mild normal weakyes sunny mild normal strongyes overcast mild high strongyes overcast hot normal weakno rain mild high strong同样,每个单元格里限制最多有9个字符,加上一个’\0’终止符,共十个。
而样本数量,也就是行数,可以适当的多一点,暂设为30。
因此我们采用三维数组char sample[30][10][10]来容纳样本数据。
X的初始值为1for(y=1;y<=FeatureNum;y++){printf("特征%s的取值:",feature[y][0]);gets(sample[x-1][y]);}printf("该样本归于哪一种分类:");gets(sample[x-1][0]);x++;SampleNum++; //统计样本的数量3.计算概率class probability{public:int id; //给每个概率值一个定位ID,方便查找double p;probability(){p=0;}};probability prob[729];采用一729个类来存放每个属性值在不同分类下的概率。
至多有9种属性,每个属性至多拥有9个值,而要计算这9个属性的9种值在9种不同分类下的概率,所以我们用了729个类。
并且在构造函数里面初始化概率p 为0.接下来,统计各种分类出现的个数。
9种分类出现的数目,分别储存在SampleClassNum[9]的不同单元格里。
int SampleClassNum[9]={0,0,0,0,0,0,0,0,0};for(c=1;c<=feature[0][0][0];c++)for(x=0;x<SampleNum;x++)if(strcmp(feature[0][c],sample[x][0])==0)SampleClassNum[c-1]++;然后,我们可以开始计算概率了。
for(c=1;c<=feature[0][0][0];c++)for(x=1;x<=FeatureNum;x++)for(y=1;y<=feature[0][0][x];y++){prob[counter].id=c*100+x*10+y;for(i=0;i<SampleNum;i++){if(strcmp(feature[x][y],sample[i][x])==0 &&strcmp(feature[0][c],sample[i][0])==0)prob[counter].p++; //统计某一值在某一分类下的出现个数}prob[counter].p=prob[counter].p/SampleClassNum[c-1]; //出现个数除以分类出//现总数,计算出概率counter++;}每个概率的ID为3位整数,百位记录了分类信息,个位十位分别是,其属性值在表格中的X,Y坐标。