实验三分类算法实验Word文档格式.docx
《实验三分类算法实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验三分类算法实验Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
=
P(A|B0)
。
分别算出
取其中的最大值,其中,P(A)的值相同,可以不算出来。
If(P(B|A)最大==测试样例.ClassValues)returntrue;
Elsereturnfalse;
4、实验内容及步骤
实验内容:
利用贝叶斯算法或者决策树算法进行数据分类操作
数据集:
汽车评估数据集(见附录)
实验步骤:
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>
计算
(四个里面取最大)
4>
实验结果
四、思考题:
1.两种算法在训练数据集和测试数据集上的性能一致吗?
哪个比较好?
决策树(decisiontree)是一个树结构(可以是二叉树或非二叉树)。
其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。
所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。
决策树的成功率为:
61.80372%,贝叶斯成功率为:
68.7831%(贝叶斯更好一点)
相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际应用中,对于探测式的知识发现,决策树更加适用。
2.提出一种提高分类器性能的方法并通过实验验证。
5、实验心得
通过这次实验加深了我对朴素贝叶斯的认识,学会了用朴素贝叶斯算法解决具体的问题。
朴素贝叶斯分类是一种十分简单的分类算法,对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就觉得此待分类项属于哪个类别。
朴素贝叶斯的原理决定了其成功率不可能太高,但是朴素贝叶斯的简单易用性使得其在一些日常生活中应用广泛。
附件(代码)
#include<
iostream>
cstdlib>
cstring>
vector>
fstream>
stdio.h>
usingnamespacestd;
intcountTrain=0;
//训练样本数目
intcountTest=0;
//测试样本数目
intcountTestSuc=0;
//测试样本正确的数目
intcountF=100;
//训练和测试的分界
stringCVname[4]={"
unacc"
"
acc"
good"
vgood"
};
intClassValues[4];
//unacc,acc,good,vgood
intbuying[4][4];
//vhigh,high,med,low.
intmaint[4][4];
//vhigh,high,med,low.
intdoors[4][4];
//2,3,4,5more.
intpersons[4][4];
//2,4,more.
intlug_boot[4][4];
//small,med,big.
intsafety[4][4];
//low,med,high.
floatClassValuesL[4];
floatbuyingL[4][4];
floatmaintL[4][4];
floatdoorsL[4][4];
floatpersonsL[4][4];
floatlug_bootL[4][4];
floatsafetyL[4][4];
**/
//统计个数
voidTonji(stringa,stringb,stringc,stringd,stringe,stringf,stringg){
//cout<
a<
"
"
b<
c<
d<
e<
f<
g<
endl;
for(inti=0;
i<
4;
i++)
if(g==CVname[i]){
ClassValues[i]++;
//buying:
vhigh,high,med,low.
if(a=="
vhigh"
)buying[0][i]++;
elseif(a=="
high"
)buying[1][i]++;
med"
)buying[2][i]++;
low"
)buying[3][i]++;
//maint:
vhigh,high,med,low.
if(b=="
)maint[0][i]++;
elseif(b=="
)maint[1][i]++;
)maint[2][i]++;
)maint[3][i]++;
//doors:
2,3,4,5more.
if(c=="
2"
)doors[0][i]++;
elseif(c=="
3"
)doors[1][i]++;
4"
)doors[2][i]++;
elsedoors[3][i]++;
//persons:
2,4,more.
if(d=="
)persons[0][i]++;
elseif(d=="
)persons[1][i]++;
elsepersons[2][i]++;
//lug_boot:
small,med,big.
if(e=="
small"
)lug_boot[0][i]++;
elseif(e=="
)lug_boot[1][i]++;
big"
)lug_boot[2][i]++;
//safety:
low,med,high.
if(f=="
)safety[0][i]++;
elseif(f=="
)safety[1][i]++;
)safety[2][i]++;
break;
}
}
//读取文件
voidReadFileTrain(){
ifstreamfin("
CarDatas.txt"
);
stringa,b,c,d,e,f,g;
inti=countF;
while((i--)>
0&
&
fin>
>
a&
b&
c&
d&
e&
f&
g){
countTrain++;
Tonji(a,b,c,d,e,f,g);
fin.close();
cout<
训练样本countTrain="
countTrain<
//统计得到在各类别下各个特征属性的条件概率估计
voidCalAP(){//概率P(yi)
for(inti=0;
i++){
ClassValuesL[i]=(float)ClassValues[i]/countTrain;
//特别注意的是P(ai|yi)=ai/0的情况!
!
,会使P(ai|yi)等于nan;
i++){//概率P(ai|yi)
for(intj=0;
j<
j++){
buyingL[i][j]=(float)buying[i][j]/ClassValues[j];
if(buyingL[i][j]<
0||buyingL[i][j]>
1)buyingL[i][j]=0;
maintL[i][j]=(float)maint[i][j]/ClassValues[j];
if(maintL[i][j]<
0||maintL[i][j]>
1)maintL[i][j]=0;
doorsL[i][j]=(float)doors[i][j]/ClassValues[j];
if(doorsL[i][j]<
0||doorsL[i][j]>
1)doorsL[i][j]=0;
}
3;
i++){//概率P(ai|yi)
personsL[i][j]=(float)persons[i][j]/ClassValues[j];
if(personsL[i][j]<
0||personsL[i][j]>
1)personsL[i][j]=0;
lug_bootL[i][j]=(float)lug_boot[i][j]/ClassValues[j];
if(lug_bootL[i][j]<
0||lug_bootL[i][j]>
1)lug_bootL[i][j]=0;
safetyL[i][j]=(float)safety[i][j]/ClassValues[j];
if(safetyL[i][j]<
0||safetyL[i][j]>
1)safetyL[i][j]=0;
//一行数据的准确与否,P(Bi|A)=P(A|Bi)P(Bi)/P(A),其中P(A)相同,只需比较分子的大小即可
boolTestLine(stringai,stringbi,stringci,stringdi,stringei,stringfi,stringgi){
intb,m,d,p,l,s;
//buying:
if(ai=="
)b=0;
elseif(ai=="
)b=1;
)b=2;
)b=3;
//maint:
if(bi=="
)m=0;
elseif(bi=="
)m=1;
)m=2;
)m=3;
//doors:
if(ci=="
)d=0;
elseif(ci=="
)d=1;
)d=2;
elsed=3;
//persons:
if(di=="
)p=0;
elseif(di=="
)p=1;
elsep=2;
//lug_boot:
if(ei=="
)l=0;
elseif(ei=="
)l=1;
)l=2;
//safety:
if(fi=="
)s=0;
elseif(fi=="
)s=1;
)s=2;
floatBi;
floatMaxB=0;
intt=0;
//计算四个P(Bi|A)的概率取最大的
for(inti=0;
Bi=buyingL[b][i]*maintL[m][i]*doorsL[d][i]*personsL[p][i]*lug_bootL[l][i]*safetyL[s][i]*ClassValuesL[i];
if(MaxB<
Bi&
Bi<
=1){
MaxB=Bi;
t=i;
}
//判断预测和事实是否相等
if(CVname[t]==gi)returntrue;
elsereturnfalse;
}
//读取并测试文件
voidReadFileTest(){
boolt=false;
inti=0;
while(++i&
if(i>
countF){
countTest++;
t=TestLine(a,b,c,d,e,f,g);
if(t)countTestSuc++;
voidsetZero();
intmain(){
inta[5]={100,200,500,700,1350};
5;
setZero();
countF=a[i];
ReadFileTrain();
//读取文件并且统计个数
CalAP();
//计算条件概率
ReadFileTest();
//测试样本
cout<
预测正确countTestSuc="
countTestSuc<
测试样本countTest="
countTest<
准确率为:
100.0*((float)countTestSuc/(float)countTest)<
%"
endl<
return0;
voidsetZero(){
countTrain=0;
countTest=0;
countTestSuc=0;
for(intj=0;
ClassValues[i]=0;
buying[i][j]=0;
maint[i][j]=0;
doors[i][j]=0;
persons[i][j]=0;
lug_boot[i][j]=0;
safety[i][j]=0;
ClassValuesL[i]=0;
buyingL[i][j]=0;
maintL[i][j]=0;
doorsL[i][j]=0;
personsL[i][j]=0;
lug_bootL[i][j]=0;
safetyL[i][j]=0;