实验要求,利用贝叶斯进行分类:
贝叶斯后验概率公式:
实验题目:设有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;
}
}