朴素贝叶斯分类器

朴素贝叶斯分类器

Naive Bayesian Classifier

C 语言实现

信息电气工程学院计算本1102班 马 振 磊

[1**********]

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)

因此,在分类时,只需比较每个属性在分类下的概率累乘,再乘该分类的概率即可。

以上是根据天气的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)/K P(no| sunny ,cool ,high ,strong )=P(no)P(sunny|no)P(cool |no)P(high|no)P(strong|no)/K

K 为缩放因子,我们只需要知道两个概率哪个大,所以可以忽略K 。

P(yes)=9/14 P(no)=5/14

P(sunny|yes)=2/9 P(cool|yes)=1/3 P(high|yes)=1/3 P(strong|yes)=1/3 P(sunny|no)=3/5 P(cool|no)=1/5 P(high|no)=4/5 P(strong|no)=3/5

P(yes| sunny ,cool ,high ,strong)=9/14*2/9*1/3*1/3*1/3=0.00529 P(no| sunny ,cool ,high ,strong )=5/14*3/5*1/5*4/5*3/5=0.20571 No 的概率大,所以该样本实例属于no 分类。

2. 数据结构及代码实现

1. 属性及分类

我们限定分类器的属性不大于9个,每个属性拥有不大于9个值。于是,我们考虑采用一个9 X 9的表格存储属性及其值。

为了调用数据方便,我们把数据从第一行开始储存。为了充分利用存储空间,我们把第零行储存分类数据。

现在,我们可以采用一个10 X 10 的表格来储存数据了。而每个单元格的内容需要占用一定的储存空间,我们可以用一个三维数组char feature[10][10][10]来表示这种结构的数据。用来容纳9个属性的9个值。第0行,我们用来储存分类数据。而第一行的第一列没有被使用,而其中含有10个char 类型的数据我们可以用它来储存属性值的多少。 前一段的数据:

分类: yes no 属性outlook : sunny overcast rain 属性temperature : hot mild cool 属性humidity : high normal 属性wind : strong weak

代码如下:

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"); 数组

printf("该事物可以被分为几种类别:"); scanf("%c",&feature[0][0][0]); feature[0][0][0]-=48; getchar();

system("cls");

for(y=1;y

//分类数目存入feature[0][0][0]

for(y=1;y

printf("请输入第%d个值:",y); gets(feature[x][y]); } x++;

通过这段代码的循环,输入属性及其值进入feature 数组。

通过以下代码将分类数据存入数组第0行。

//通过循环将分类存入第0行

printf("请输入第%d种类别的名称:",y); gets(feature[0][y]); }

2. 训练样本

同样,每个单元格里限制最多有9个字符,加上一个’\0’终止符,共十个。而样本数量,也就是行数,可以适当的多一点,暂设为30。因此我们采用三维数组char sample[30][10][10]来容纳样本数据。

X 的初始值为1

for(y=1;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; double p;

probability() {

p=0; }

//给每个概率值一个定位ID ,方便查找

};

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

if(strcmp(feature[0][c],sample[x][0])==0) SampleClassNum[c-1]++;

然后,我们可以开始计算概率了。

for(c=1;c

for(x=1;x

for(y=1;y

prob[counter].id=c*100+x*10+y; for(i=0;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 坐标。 然后,进行比较,统计出出现个数,接着除以分类的出现总数,计算出概率。

4. 对新的实例进行分类

输入该新的实例。

char instance[9][10];

double Pinstance[9]={1,1,1,1,1,1,1,1,1}; int PID[9];

printf("贝叶斯分类器 Sept 5\n"); printf("请输入要分类的样本属性\n"); for(i=1;i

printf("特征%s的取值",feature[i][0]); gets(instance[i-1]); }

然后,计算出不含分类信息的值在表格中的X ,Y 坐标。

for(x=1;x

for(y=1;y

if(strcmp(feature[x][y],instance[x-1])==0) {

PID[x-1]=x*10+y; break; } }

根据X ,Y 坐标加上分类坐标,组成完整的3位数坐标。在概率表prob 中查找即可找到。通过累乘,然后乘上某一分类的概率,即可求出最终的概率。

for(c=1;c

for(y=0;y

for(i=0;i

if(prob[i].id==PID[y]+c*100) break;

Pinstance[c-1]=Pinstance[c-1]*prob[i].p; //累乘求概率 }

Pinstance[c-1]=Pinstance[c-1]*(SampleClassNum[c-1]/(double)SampleNum); //最后乘上这一分类的概率,即可求出最终概率 }

system("cls");

6. 输出各概率及分类

最后,比较各概率的大小,最大的所属分类,就是该实例的所属分类。

double t=0;

for(i=0;i

for(i=0;i

for(y=1;y

printf("%s的概率为:%lf\n",feature[0][y],Pinstance[y-1]);

朴素贝叶斯分类器

Naive Bayesian Classifier

C 语言实现

信息电气工程学院计算本1102班 马 振 磊

[1**********]

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)

因此,在分类时,只需比较每个属性在分类下的概率累乘,再乘该分类的概率即可。

以上是根据天气的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)/K P(no| sunny ,cool ,high ,strong )=P(no)P(sunny|no)P(cool |no)P(high|no)P(strong|no)/K

K 为缩放因子,我们只需要知道两个概率哪个大,所以可以忽略K 。

P(yes)=9/14 P(no)=5/14

P(sunny|yes)=2/9 P(cool|yes)=1/3 P(high|yes)=1/3 P(strong|yes)=1/3 P(sunny|no)=3/5 P(cool|no)=1/5 P(high|no)=4/5 P(strong|no)=3/5

P(yes| sunny ,cool ,high ,strong)=9/14*2/9*1/3*1/3*1/3=0.00529 P(no| sunny ,cool ,high ,strong )=5/14*3/5*1/5*4/5*3/5=0.20571 No 的概率大,所以该样本实例属于no 分类。

2. 数据结构及代码实现

1. 属性及分类

我们限定分类器的属性不大于9个,每个属性拥有不大于9个值。于是,我们考虑采用一个9 X 9的表格存储属性及其值。

为了调用数据方便,我们把数据从第一行开始储存。为了充分利用存储空间,我们把第零行储存分类数据。

现在,我们可以采用一个10 X 10 的表格来储存数据了。而每个单元格的内容需要占用一定的储存空间,我们可以用一个三维数组char feature[10][10][10]来表示这种结构的数据。用来容纳9个属性的9个值。第0行,我们用来储存分类数据。而第一行的第一列没有被使用,而其中含有10个char 类型的数据我们可以用它来储存属性值的多少。 前一段的数据:

分类: yes no 属性outlook : sunny overcast rain 属性temperature : hot mild cool 属性humidity : high normal 属性wind : strong weak

代码如下:

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"); 数组

printf("该事物可以被分为几种类别:"); scanf("%c",&feature[0][0][0]); feature[0][0][0]-=48; getchar();

system("cls");

for(y=1;y

//分类数目存入feature[0][0][0]

for(y=1;y

printf("请输入第%d个值:",y); gets(feature[x][y]); } x++;

通过这段代码的循环,输入属性及其值进入feature 数组。

通过以下代码将分类数据存入数组第0行。

//通过循环将分类存入第0行

printf("请输入第%d种类别的名称:",y); gets(feature[0][y]); }

2. 训练样本

同样,每个单元格里限制最多有9个字符,加上一个’\0’终止符,共十个。而样本数量,也就是行数,可以适当的多一点,暂设为30。因此我们采用三维数组char sample[30][10][10]来容纳样本数据。

X 的初始值为1

for(y=1;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; double p;

probability() {

p=0; }

//给每个概率值一个定位ID ,方便查找

};

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

if(strcmp(feature[0][c],sample[x][0])==0) SampleClassNum[c-1]++;

然后,我们可以开始计算概率了。

for(c=1;c

for(x=1;x

for(y=1;y

prob[counter].id=c*100+x*10+y; for(i=0;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 坐标。 然后,进行比较,统计出出现个数,接着除以分类的出现总数,计算出概率。

4. 对新的实例进行分类

输入该新的实例。

char instance[9][10];

double Pinstance[9]={1,1,1,1,1,1,1,1,1}; int PID[9];

printf("贝叶斯分类器 Sept 5\n"); printf("请输入要分类的样本属性\n"); for(i=1;i

printf("特征%s的取值",feature[i][0]); gets(instance[i-1]); }

然后,计算出不含分类信息的值在表格中的X ,Y 坐标。

for(x=1;x

for(y=1;y

if(strcmp(feature[x][y],instance[x-1])==0) {

PID[x-1]=x*10+y; break; } }

根据X ,Y 坐标加上分类坐标,组成完整的3位数坐标。在概率表prob 中查找即可找到。通过累乘,然后乘上某一分类的概率,即可求出最终的概率。

for(c=1;c

for(y=0;y

for(i=0;i

if(prob[i].id==PID[y]+c*100) break;

Pinstance[c-1]=Pinstance[c-1]*prob[i].p; //累乘求概率 }

Pinstance[c-1]=Pinstance[c-1]*(SampleClassNum[c-1]/(double)SampleNum); //最后乘上这一分类的概率,即可求出最终概率 }

system("cls");

6. 输出各概率及分类

最后,比较各概率的大小,最大的所属分类,就是该实例的所属分类。

double t=0;

for(i=0;i

for(i=0;i

for(y=1;y

printf("%s的概率为:%lf\n",feature[0][y],Pinstance[y-1]);


相关内容

  • 朴素贝叶斯方法在中医证候分类识别中的应用研究_张丽伟
  • 2007年9月第38卷第5期内蒙古大学学报(自然科学版) Journ al of Inn er M ongolia Univer sity 2007Sep . . 38Vol No . 5 文章编号:1000-1638(2007) 05-0568-04 朴素贝叶斯方法在中医证候分类识别中的 应用研究 ...

  • 最小错误率贝叶斯分类器
  • 硕士研究生专业课考试大作业 课程名称: 课程编号: 任课教师姓名: 职称: 学生姓名: 学号: 作业题目: 成绩:模式识别 063806 刘海波 副教授 黄跃平 S309060181 最小错误率贝叶斯分类器 二〇一〇年四月二十五日 最小错误率贝叶斯分类 摘要:统计决策理论是处理模式识别问题的基本理论 ...

  • 急切式和懒惰式学习策略相结合的决策树分类模型
  • 第29卷第5期 北 京 交 通 大 学 学 报 Vol.29No.5文章编号:1673-0291(2005)05-0092-06 急切式和懒惰式学习策略相结合的决策树分类模型 黄泽宇1,卢润彩2 (1.北京交通大学计算机与信息技术学院,北京100044;2.石家庄信息工程职业学院计算机系,河北050 ...

  • 贝叶斯分类
  • 2.1.什么是贝叶斯分类 据维基百科上的介绍,贝叶斯定理是关于随机事件A 和B 的条件概率和边缘概率的一则定理. 如上所示,其中P(A|B)是在B 发生的情况下A 发生的可能性.在贝叶斯定理中,每个名词都有约定俗成的名称: ∙ P(A)是A 的先验概率或边缘概率.之所以称为" 先验&quo ...

  • 毕业生就业数据分析系统开发
  • 计算机信息工程学院毕业设计说明书 毕业生就业数据分析系统开发 摘要 高校毕业生的就业问题已经成为全社会都关注的热点问题.这些年来高校招生规模逐年扩大,不断增加的毕业生数目给高校的就业管理工作造成了很大的压力.在这种形势下,如果仍然采用传统的毕业生管理办法,不仅仅工作效率低下,而且工作质量不高,很容易 ...

  • 手机用户精准识别
  • 手机用户精准识别 摘要 随着移动通信.互联网业务的迅速发展,手机已经从奢侈品变成了生活日 用品,是我们日常生活中不可缺少的一部分.人们随时随地使用手机打电话.发短信.上网,而用户的这些行为以及其个人基本信息均在运营商处有所记录. 今天我们就在这里讨论一下职场新人的识别问题. 针对问题一,在分析了职场 ...

  • 模式识别习题及答案
  • 第一章 绪论 1.什么是模式?具体事物所具有的信息. 模式所指的不是事物本身,而是我们从事物中获得的___信息__. 2.模式识别的定义?让计算机来判断事物. 3.模式识别系统主要由哪些部分组成?数据获取-预处理-特征提取与选择-分类器设计/ 分类决策. 第二章 贝叶斯决策理论 ⎧wp(x|w1) ...

  • 回归.分类与聚类:三大方向剖解机器学习算法的优缺点(附Python和R实现)
  • 选自EliteDataScience 机器之心编译 参与:蒋思源.晏奇 在本教程中,作者对现代机器学习算法进行一次简要的实战梳理.虽然类似的总结有很多,但是它们都没有真正解释清楚每个算法在实践中的好坏,而这正是本篇梳理希望完成的.因此本文力图基于实践中的经验,讨论每个算法的优缺点.而机器之心也在文末 ...

  • 线性SVM算法与最小平方误差算法的比较
  • 线性SVM 算法与最小平方误差算 法的比较 (哈尔滨工程大学 动力与能源工程学院,黑龙江 哈尔滨 150001) 摘要:在机器识别模式里,在基于贝叶斯决策理论之上有多种算法.机器识别应用领 域十分广泛,例如可以区分柴油机是否工作正常.在此,我利用两种不同的算法对两批不同的柴油机的多项热力学参数进行分 ...