周志华机器学习第7章第3题

版权声明:本文为博主原创文章,未经博主允许不得转载。
7.3 试编程实现拉普拉斯修正的朴素贝叶斯分类器,并以西瓜数据集3.0为训练集,对p151“测1”样本进行判别。
1.C++代码如下:

#include

#include

#include<math.h>

#define pai 3.14159265

using namespace std;

int main()

{

int i,j,k,totalnumber=0,c0=0,c1=0;

int train[20][10]; //训练集数组,第一个下标指样本的序号,第二个下标指属性;(不包括密度和含糖率两个属性)

double
average70=0,average71=0,average80=0,average81=0,variance70=0,variance71=0,variance80=0,variance81=0,p1=1,p0=1,t1,t2,t3,t4;

double possibility[2][10]; //概率矩阵,第一个下标0和1指分类,第二个下标1-9指属性。

double density[20]={0}; //训练集数组,储存密度值

double sugar[20]={0}; //训练集数组,储存含糖率值

int goodnumber[10][5]={0};//对好瓜类别中各个属性个数的计数

int badnumber[10][5]={0};//对坏瓜类别中各个属性个数的计数

/输入西瓜训练集数据*/

ifstream file(“D://data storage/C++ code/watermelon.txt”);

for ( i=1;i<18;i++)

{

for (j=1;j<10;j++)

{

if (j<7)

           {

             file>>train[i][j];

             if (i<9)

goodnumber[j][train[i][j]]++; //只对前6个属性计数

               else

badnumber[j][train[i][j]]++;

           }

if (j==7) file>>density[i];

if (j==8) file>>sugar[i];

if (j==9)

          {

   
     file>>train[i][j];

             if (train[i][j]) c1++;  //c1,c2对两个类别计数

                else c0++;

           }

}

totalnumber++;

}

/输入西瓜测试集集数据****/

for (j=1;j<9;j++)

{

if (j<7)

           {

             file>>train[0][j];

           }

          else if (j==7)

file>>density[0]; //为省事,将测试集放在训练集第一个下标为0的数组内

             else file>>sugar[0];

}

/*计算不同分类下密度和含糖率的类条件概率/

for (i=1;i<9;i++)

{

average71=average71+density[i];

average81=average81+sugar[i];

}

average71=average71/8;

average81=average81/8; // 求密度和含糖率的均值

for (i=1;i<9;i++)

{

variance71=variance71+pow(density[i]-average71,2);

variance81=variance81+pow(sugar[i]-average81,2);

}

variance71=variance71/7;

variance81=variance81/7; // 求密度和含糖率的方差,这里注意方差公式分母为(n-1)

for (i=9;i<18;i++)

{

average70=average70+density[i];

average80=average80+sugar[i];

}

average70=average70/9;

average80=average80/9;

for (i=9;i<18;i++)

{

variance70=variance70+(density[i]-average70)*(density[i]-average70);

variance80=variance80+pow(sugar[i]-average80,2);

}

variance70=variance70/8;

variance80=variance80/8;

possibility[0][7]=1/(sqrt(2paivariance70))*exp(-pow(density[0]-average70,2)/2/variance70);

possibility[1][7]=1/(sqrt(2paivariance71))*exp(-pow(density[0]-average71,2)/2/variance71);

possibility[0][8]=1/(sqrt(2paivariance80))*exp(-pow(sugar[0]-average80,2)/2/variance80);

possibility[1][8]=1/(sqrt(2paivariance81))*exp(-pow(sugar[0]-average81,2)/2/variance81);

/计算不同分类下前6个属性的类条件概率***/

for
(k=1;k<7;k++)

{

if (k<6)

{

t1=1+badnumber[k][train[0][k]]; t2=3+c0;
//这里需要将整数转为小数做除法

             possibility[0][k]=t1/t2;

t3=1+goodnumber[k][train[0][k]]; t4=3+c1;

             possibility[1][k]=t3/t4;

}

else

{

t1=1+badnumber[k][train[0][k]]; t2=2+c0;

             possibility[0][k]=t1/t2;

t3=1+goodnumber[k][train[0][k]]; t4=2+c1;

             possibility[1][k]=t3/t4;

}

}

/计算不同分类的类先验概率/

t1=1+c0;t2=2+totalnumber;

possibility[0][9]=t1/t2;

t3=1+c1;t4=2+totalnumber;

possibility[1][9]=t3/t4;

/计算不同分类的总概率***/

for (k=1;k<10;k++)

{

p0=p0*possibility[0][k];

p1=p1*possibility[1][k];

}

/输出结果******/

cout<<“测1数据的朴素贝叶斯分类结果为:”<<endl;

cout<<“分类为好瓜的概率为:”<<p1<<endl;

cout<<“分类为坏瓜的概率为:”<<p0<<endl;

if (p0<p1) cout<<“因此它为好瓜!”<<endl;

else if
(p0>p1)cout<<“因此它为坏瓜!”<<endl;

else cout<<“无法判断!”<<endl;

return 0;

}

**2.最终结果:**测1数据的朴素贝叶斯分类结果为:

分类为好瓜的概率为:0.025631

分类为坏瓜的概率为:7.72236e-005

因此它为好瓜!

Process returned 0 (0x0) execution time : 0.063 s

Press any key to continue.

3.西瓜数据集3.0

1 1 1 1 1 1 0.697 0.460 1

2 1 2 1 1 1 0.774 0.376 1

2 1 1 1 1 1 0.634 0.264 1

1 1 2 1 1 1 0.608 0.318 1

3 1 1 1 1 1 0.556 0.215 1

1 2 1 1 2 2 0.403 0.237 1

2 2 1 2 2 2 0.481 0.149 1

2 2 1 1 2 1 0.437 0.211 1

2 2 2 2 2 1 0.666 0.091 0

1 3 3 1 3 2 0.243 0.267 0

3 3 3 3 3 1 0.245 0.057 0

3 1 1 3 3 2 0.343 0.099 0

1 2 1 2 1 1 0.639 0.161 0

3 2 2 2 1 1 0.657 0.198 0

2 2 1 1 2 2 0.360 0.370 0

3 1 1 3 3 1 0.593 0.042 0

1 1 2 2 2 1 0.719 0.103 0

1 1 1 1 1 1 0.697 0.460 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值