实验三:分类算法实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUNAN UNIVERSITY
题目实验三:分类算法实验
学生姓名蒙寿伟
学生学号201408070120
专业班级智能科学与技术1401班
指导老师袁进
日期2017年5月15日
一.实验目的
1.了解朴素贝叶斯算法和决策树算法的基本原理;
2.能够使用朴素贝叶斯算法或者决策树算法对数据进行分类
3.学会对于分类器的性能评估方法
二、实验的硬件、软件平台 硬件:计算机
软件:操作系统:WINDOWS 2000 应用软件:C,Java 或者Matlab
三、实验相关知识
贝叶斯定理:)
()
()|()|(P A P B P B A P A B =
P(A)是 A 的先验概率,之所以称为“先验”是因为它不考虑任何 B 方面的因素。 P(A|B)是已知 B 发生后 A 的条件概率,也由于得自 B 的取值而被称作 A 的后验概率。 P(B|A)是已知 A 发生后 B 的条件概率,也由于得自 A 的取值而被称作 B 的后验概率。 P(B)是 B 的先验概率,也作标淮化常量(normalizing constant )。
以第一条数据为例:vhigh,vhigh,2,2,small,low,unacc
ClassValues: unacc, acc, good, vgood 对应P(Bi)。(i=0,1,2,3)
分别算出
取其中的最大值,其中,P(A)的值相同,可以不算出来。
If(P(B|A)最大 == 测试样例.ClassValues) return true; Else return false;
buying:vhigh,high,med,low.maint:vhigh,high,med,low.doors:2,3,4,5more.
Persons:2,4,more.lug_boot:small,med,big.safety:low,med,
high.
(i=0,1,2,3
)
)
()0()0|()|0(P A P B P B A P A B =
)()
1()1|()|1(P A P B P B A P A B =
)()2()2|()|2(P A P B P B A P A B =
)()
3()3|()|3(P A P B P B A P A B =
四、实验内容及步骤
实验内容:
利用贝叶斯算法或者决策树算法进行数据分类操作
数据集:汽车评估数据集(见附录)
实验步骤:
1.仔细阅读并了解实验数据集;
2.使用任何一种熟悉的计算机语言(比如C,Java或者matlab)实现朴素贝叶斯算法或者决策树算法;
3.利用朴素贝叶斯算法或者决策树算法在训练数据上学习分类器,训练数据的大小分别设置为:前100个数据,前200个数据,前500个数据,前700个数据,前1000个数据,前1350个数据;
4.利用测试数据对学习的分类器进行性能评估;
5.统计分析实验结果并上交实验报告;
<1>定义和初始化变量
<2>统计并计算条件概率P(Ai|Bi),(i=0,1,2,3),当训练数据比较小时会出现Bi等于0的情况,这时P(Ai|Bi)=nan,所以可以加一个判断,当P(Ai|Bi)<0或P(Ai|Bi)>1时,让P(Ai|Bi)=0.
<3>计算
)
(
) (
)
|
(
)
|
(P
A
P Bi
P
Bi
A
P
A
Bi (四个里面取最大)
<4>实验结果
四、思考题:
1. 两种算法在训练数据集和测试数据集上的性能一致吗?哪个比较好?
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。
决策树的成功率为: 61.80372% ,贝叶斯成功率为:68.7831% (贝叶斯更好一点)
相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际应用中,对于探测式的知识发现,决策树更加适用。
2. 提出一种提高分类器性能的方法并通过实验验证。
五、实验心得
通过这次实验加深了我对朴素贝叶斯的认识,学会了用朴素贝叶斯算法解决具体的问题。朴素贝叶斯分类是一种十分简单的分类算法,对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就觉得此待分类项属于哪个类别。朴素贝叶斯的原理决定了其成功率不可能太高,但是朴素贝叶斯的简单易用性使得其在一些日常生活中应用广泛。
附件(代码)
#include
#include
#include
#include
#include
#include
using namespace std;
int countTrain = 0;//训练样本数目
int countTest = 0;//测试样本数目
int countTestSuc = 0;//测试样本正确的数目
int countF=100; //训练和测试的分界
string CVname[4]={"unacc","acc","good","vgood"};
int ClassValues[4]; //unacc, acc, good, vgood
int buying[4][4]; //vhigh, high, med, low.
int maint[4][4]; // vhigh, high, med, low.
int doors[4][4]; //2, 3, 4, 5more.
int persons[4][4]; //2, 4, more.
int lug_boot[4][4]; //small, med, big.
int safety[4][4]; //low, med, high.
float ClassValuesL[4]; //unacc, acc, good, vgood
float buyingL[4][4]; //vhigh, high, med, low.
float maintL[4][4]; // vhigh, high, med, low.
float doorsL[4][4]; //2, 3, 4, 5more.
float personsL[4][4]; //2, 4, more.
float lug_bootL[4][4]; //small, med, big.
float safetyL[4][4]; //low, med, high.
**/
//统计个数
void Tonji(string a,string b,string c,string d,string e,string f,string g){