当前位置:文档之家› 机器学习-朴素贝叶斯学习-原理分析与C语言代码实现

机器学习-朴素贝叶斯学习-原理分析与C语言代码实现

现在我们根据贝叶斯法则重写上面的公式:
������������������������
=
������������������������������������ ������������ ∈{������������������,������������ }
������
������������
������������������������ℎ������������
现在我们需要做的就是计算式3中������ ������������������������ℎ������������ ������������ 和������(������������ )的值,计算������(������������ )的值比较容 易,只需要把训练样例中每个目标属性������������ 出现的概率即可;要计算������ ������������������������ℎ������������ ������������ 的值,需
……………………..1
������������������������
=
������������������������������������ ������ ������������ ∈{������������������,������������ }
������������������������ ℎ������������ ������������ ∗������(������������ )……………….....2
No
表 1:朴素贝叶斯学习起使用的训练样例
我们先计算 P(Vj)的值,Vj 有两个值,yes 和 no: P(yes)=9/14=0.643,P(no)=5/14=0.357。 然后分别计算在目标属性为 yes 和 no 时,测试样例的各个属性的条件概率。注意,我 们在计算各个属性的条件概率时,采用了 m-估计的方法计算。比如在计算 P(sunny|yes)(目 标属性为 yes,Outlook 的属性值为 Sunny 的概率)时,按普通的计算方法: P(sunny|yes)=nc/n=2/9,nc=2 是在训练样例中目标属性为 yes 的条件下 Outlook=sunny 的样例数,n=9 是训练样例中目标属性值为 yes 的样例数; 但是按 m_估计的方法,计算出的概率是: P(sunny|yes)=(nc+m*p)/(n+m)=(2+14*0.33)/(9+14),nc=2 和 n=9 代表的意思和上一样,
四, 朴素贝叶斯学习器代码
朴素贝叶斯学习器的代码很简单,先训练样例统计各个属性的概率,然后根据测试样例 的各个属性值取出对应的概率,并相乘即可,测试结果如下:
朴素贝叶斯学习器完整代码如下: //朴素贝叶斯学习器算法 C 语言代码实现 //Copyright:wxh5055
#include <stdio.h>
//天气类型 typedef enum _outlook {
sunny, overcast, rain }_outlook;
������������
∗ ������ ������������������������������������������������������������������ ������������
∗ ������ ������������������������������������������������ ������������
作者:wxh5055
机器学习-朴素贝叶斯学习
原理分析与 C 语言代码实现
一, 任务介绍
本文介绍朴素贝叶斯学习的基本原理以及其算法实现的 C 语言代码。 朴素贝叶斯学习也叫朴素贝叶斯分类器,它是根据贝叶斯法则进行学习的一种算法。贝 叶斯法则是条件概率相互计算的法则,即在已知 P(A|B)的情况下怎么计算 P(B|A)。P(A|B)是 条件概率,表示在条件 B 成立的条件下条件 A 发生的概率,贝叶斯法则的表达式如下:
有了条件概率的计算公式,我们就可计算出式6中的所有项的值: P(su nny |yes)= 0.290;P(cool |yes)=0.333;P(high |yes)=0.435;P(strong|ye s)=0.435; P(sunny|no)=0.403;P(cool|no)=0.298;P(high|no)=0.579;P(strong|no)=0.526; 所以根据式6: P(vj=yes)=P(yes)* P(sunny|yes)* P(cool|yes)* P(high|yes)* P(strong|yes)=0.0117; P(vj=no)=P(no)* P(sunny|no)* P(cool|no)* P(high|no)* P(strong|no)=0.0131。 所以,该测试样例的朴素贝叶斯分类结果为 PlayTennis=no,因条件概率 P(vj=no)大于条 件概率 P(vj=yes)。 如果把这两个概率进行归一化处理,则 P(vj=yes)=0.473,P(vj=no)=0.528。
}
������
������������������������������������������ , ������������������������������������������������������������������,������������������������������������������������, ������������������������
要作一些相应的假定,即给定目标值时,各属性值之间的相互条件独立。 我们把 weather 用{Outlook, Temperature , Humidity ,Wind}表示,把式3重写为:
������������������������
=
������������������������������������ ������������ ∈{���式4中就得到我们要求的朴素贝叶斯的表达式:
������������������
=
������������������������������������ ������������ ∈{������������������,������������}
������
������������������������������������������
������������������������������������ ������������������������ = ������������ ∈ ������ ������(������������ |������������������������ℎ������������) 称 vMAP 为在给定实例的属性值(weather 的各属性值)下,得到的最可能的目标值,也就 是条件概率最大的值。其中 V={yes,no},也就是说 vMAP 为目标属性集 V 中各取值(yes 或 no) 的概率最大的。朴素贝叶斯学习器即使根据上面的公式推导而来。
Strong
No
D3
Overcast
Hot
High
Weak
Yes
D4
Rain
Mild
High
Weak
Yes
D5
Rain
Cool
Normal
Weak
Yes
D6
Rain
Cool
Normal
Strong
No
D7
Overcast
Cool
Normal
Strong
Yes
D8
Sunny
Mild
High
Weak
No
������ (������������������������ ℎ������������ )
������������������������
=
������������������������������������ ������������ ∈{������������������,������������
weather={Outlook= su nny,Temperature=cool,Humidity=high,Wind s=strong};
Day
Outlook Temperature Humidity
Wind PlayTennis
Dl
Sunny
Hot
High
Weak
No
D2
Sunny
Hot
High
m=14 代表训练样例总数,p=0.33 代表在属性 Outlook 下共有3个属性值,所以这个先验概 率就等于 1/3。
选择 m-估计的原因是为了避免当训练样例数量较小时,训练样例中有可能没有测试样 例中列出的某些属性值,也就是上面的 nc=0,如果按照普通的方法,采用公式nnc ,计算出的 条件概率(比如 P(sunny|yes))就会等于0,这样,根据式6计算出的条件概率因为是相乘的 关系,其值也会为0,这样就会出现对训练样例过拟合的情况。而 m-估计采用公式nnc ++mm∗p的 形式,就可以避免出现过拟合的情况,m 取值一般为训练样例的总数,p 的值如果某个属性 有 k 个可能值,则 p=1/k,如上面 P(sunny|yes)中,因为 Outlook 有3个可能值,所以 p=1/3。
P A B ∗ P(B) P B A = P(A) 即在条件 A 成立的条件下条件 B 发生的概率,等于条件 B 成立的条件下条件 A 发生的 概率,乘以条件 B 发生的概率,再除以条件 A 发生的概率。 朴素贝叶斯学习器(分类器)就是需要计算在某个样例条件下,计算每个目标属性项发生 的概率,然后选出概率最大的目标属性 。举例说明,假设现 在我们在已知某一 天气候的情况 下(用 weather 表示),需要确定是否打网球(用 yes 和 no 表示)。朴素贝叶斯分类器就是要计 算在已知 weather 的条件下,打网球的概率 P(yes|weather)和 P(no|weather),如果前者大于 后者,就去打网球,否则就不去打网球。
相关主题