实验三:最小错误率的贝叶斯分类

实验要求,利用贝叶斯进行分类:

贝叶斯后验概率公式:

 实验题目:设有19人进行体检,结果如下表。但事后发现4人忘了写性别,试问,这4人是男是女?

#include "iostream"
using namespace std;
	const int M=50; //M为最大的类数
void main()
{   //已知类别样本15个 (身高,体重,类别)。1-男,2-女

	int n=15;
	int i,j;
	int pattern[15][3]={
		{170,68,1},
		{130,66,2},
		{180,71,1},
		{190,73,1},
		{160,70,2},
		{150,66,1},
		{190,68,1},
		{210,76,1},
		{100,58,2},
		{170,75,1},
		{140,62,1},
        {150,64,2},
        {120,66,2},
        {150,66,1},
		{130,65,1}};
     //未知类别样本4个
		int X[4][3]={
		{140,70,0},
		{150,60,0},
		{145,65,0},
		{160,75,0}};
    int K=4;// 未知类别样本个数

	for(i=0;i<15;i++)
	{for(j=0;j<3;j++)
			cout<<pattern[i][j]<<"  ";
		cout<<endl;
	}
	cout<<"未知类别的样本:"<<endl;
	for(i=0;i<4;i++)
	{for(j=0;j<3;j++)
			cout<<X[i][j]<<"  ";
		cout<<endl;
	}
	int C=2;//类别总数C=2
	static int num[M];//num[i]存放第i+1类的样本数(i=0,1,,,C-1)
	for(i=0;i<n;i++)//统计每类样本数
		num[pattern[i][2]-1]++;
	for(i=0;i<C;i++)//输出每类样本数
		cout<<i+1<<"类样本数= "<<num[i]<<endl;

	//计算每类的先验概率
	float P[M];
	for (i=0;i<C;i++)
		P[i]=num[i]/(float)n;
	for(i=0;i<C;i++)//输出每类的先验概率
		cout<<i+1<<"类的先验概率= "<<P[i]<<endl;
    cout<<"\n";
	int num1,num2;
    static float PW1[M],PW2[M]; //存放后验概率数组
	float length,weight;
	//对未知类别的样本进行分类判断
	for (int k=0;k<K;k++)	//对未知类别样本数据:身高--体重加以处理
	   {cout<<"\n第"<<k<<"个样本:X["<<k<<"]="<<X[k][0]<<"  "<<X[k][1]<<endl;
		length=X[k][0];
	    weight=X[k][1];

		num1=0;
	    for (i=0;i<n;i++)
		  if (pattern[i][0]==length&&pattern[i][2]==1)
			num1++;
		if (num1==0)  //防止 0 概率,分子分母均作处理:分子加1,分母加类别数或不同取值个数
			PW1[0]=1/(float)(num[0]+2);
		else
            PW1[0]=(num1+1)/(float)(num[0]+2);
        
		num1=0;
	    for (i=0;i<n;i++)
		  if (pattern[i][0]==weight&&pattern[i][2]==1)
			num1++;
		if (num1==0)  //防止 0 概率,分子分母均作处理:分子加1,分母加类别数或不同取值个数
			PW1[1]=1/(float)(num[0]+2);
		else
            PW1[1]=(num1+1)/(float)(num[0]+2);

		num2=0;
	    for (i=0;i<n;i++)
		  if (pattern[i][1]==height&&pattern[i][2]==2)
			 num2++;
		if (num2==0)
			PW2[0]=1/(float)(num[1]+2);
		else
            PW2[0]=(num2+1)/(float)(num[1]+2); //

        num2=0;
	    for (i=0;i<n;i++)
		  if (pattern[i][1]==weight&&pattern[i][2]==2)
			 num2++;
		if (num2==0)
			PW2[1]=1/(float)(num[1]+2);
		else
            PW2[1]=(num2+1)/(float)(num[1]+2); //

	  float PWT1=PW1[0]*PW1[1]*P[0];//计算属于第一类的后验概率
      float PWT2=PW2[0]*PW2[1]*P[1];//计算属于第二类的后验概率
      cout<<"属于第一类的后验概率="<<PWT1<<endl;
      cout<<"属于第二类的后验概率="<<PWT2<<endl;
	  if (PWT1>PWT2)
		 cout<<k<<" th pattern belongs to 1\n"<<endl;
	  else if (PWT1<PWT2)
         cout<<k<<" th pattern belongs to 2\n"<<endl;
	  else 
		 cout<<k<<" th pattern belongs to 1 or 2 is equal\n"<<endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值