📄 bayesian1.cpp
字号:
#include<iostream>
#include<fstream>
using namespace std;
float Y=0; //保存买电脑的前提下是某属性的概率
float N=0; //保存不买电脑的前提下是某属性的概率
class shiwu{ //类表示每个元组
public:
int lowThirtyYes; //6个整型变量分别表示年龄段
int lowThirtyNo;
int betweenthirty_fortyYes;
int betweenthirty_fortyNo;
int highfortyYes;
int highfortyNo;
int highYes; //3个变量分别表示收入等级
int highNo;
int mediumYes;
int mediumNo;
int lowYes;
int lowNo;
int noNo; //2个变量分别表示是否是学生
int noYes;
int yesNo;
int yesYes;
int fairYes; //2个变量分别表示信用度等级
int fairNo;
int excellentYes;
int excellentNo;
int yes;
int no;
};
shiwu age; //定义5个对象,分别为事务中的每个属性
shiwu income;
shiwu student;
shiwu credit;
shiwu buys;
float p(char *A,char *B){//计算书上P(Xi|buys_computer="yes")和P(Xi|buys_computer="no")的概率
float rs;
if(strcmp(A,"<=30")==0&&strcmp(B,"yes")==0){
rs=(float)age.lowThirtyYes/buys.yes;
}else if(strcmp(A,"<=30")==0&&strcmp(B,"no")==0){
rs=(float)age.lowThirtyNo/buys.no;
}else if(strcmp(A,"31...40")==0&&strcmp(B,"yes")==0){
rs=(float)age.betweenthirty_fortyYes/buys.yes;
}else if(strcmp(A,"31...40")==0&&strcmp(B,"no")==0){
rs=(float)age.betweenthirty_fortyNo/buys.no;
}else if(strcmp(A,">40")==0&&strcmp(B,"yes")==0){
rs=(float)age.highfortyYes/buys.yes;
}else if(strcmp(A,">40")==0&&strcmp(B,"no")==0){
rs=(float)age.highfortyNo/buys.no;
}else if(strcmp(A,"high")==0&&strcmp(B,"yes")==0){
rs=(float)income.highYes/buys.yes;
}else if(strcmp(A,"high")==0&&strcmp(B,"no")==0){
rs=(float)income.highNo/buys.no;
}else if(strcmp(A,"medium")==0&&strcmp(B,"yes")==0){
rs=(float)income.mediumYes/buys.yes;
}else if(strcmp(A,"medium")==0&&strcmp(B,"no")==0){
rs=(float)income.mediumNo/buys.no;
}else if(strcmp(A,"low")==0&&strcmp(B,"yes")==0){
rs=(float)income.lowYes/buys.yes;
}else if(strcmp(A,"low")==0&&strcmp(B,"no")==0){
rs=(float)income.lowNo/buys.no;
}else if(strcmp(A,"yes")==0&&strcmp(B,"yes")==0){
rs=(float)student.yesYes/buys.yes;
}else if(strcmp(A,"yes")==0&&strcmp(B,"no")==0){
rs=(float)student.yesNo/buys.no;
}else if(strcmp(A,"no")==0&&strcmp(B,"yes")==0){
rs=(float)student.noYes/buys.yes;
}else if(strcmp(A,"no")==0&&strcmp(B,"no")==0){
rs=(float)student.noNo/buys.no;
}else if(strcmp(A,"fair")==0&&strcmp(B,"yes")==0){
rs=(float)credit.fairYes/buys.yes;
}else if(strcmp(A,"fair")==0&&strcmp(B,"no")==0){
rs=(float)credit.fairNo/buys.no;
}else if(strcmp(A,"excellent")==0&&strcmp(B,"yes")==0){
rs=(float)credit.excellentYes/buys.yes;
}else if(strcmp(A,"excellent")==0&&strcmp(B,"no")==0){
rs=(float)credit.excellentNo/buys.no;
}
return rs;
}
void main(){
age.lowThirtyYes=0; //表示训练集中年龄在30岁以下并且买了电脑的个数
age.betweenthirty_fortyYes=0; //表示训练集中年龄在30与40岁之间并且买了电脑的个数
age.highfortyYes=0; //表示训练集中年龄在40岁以上并且买了电脑的个数
age.lowThirtyNo=0; //表示训练集中年龄在30岁以下并且没买电脑的个数
age.betweenthirty_fortyNo=0; //表示训练集中年龄在30与40岁之间并且没买电脑的个数
age.highfortyNo=0; //表示训练集中年龄在40岁以上并且没买电脑的个数
income.highYes=0; //表示训练集中收入高并且买了电脑的个数
income.mediumYes=0; //表示训练集中收入中等并且买了电脑的个数
income.lowYes=0; //表示训练集中收入低并且买了电脑的个数
income.highNo=0; //表示训练集中收入高并且没买了电脑的个数
income.mediumNo=0; //表示训练集中收入中等并且没买了电脑的个数
income.lowNo=0; //表示训练集中收入低并且没买了电脑的个数
student.yesYes=0; //表示训练集中学生买了电脑的个数
student.noYes=0; //表示训练集中非学生买了电脑的个数
student.yesNo=0; //表示训练集中学生没买电脑的个数
student.noNo=0; //表示训练集中非学生没买电脑的个数
credit.fairYes=0; //表示训练集信誉度中等并且买了电脑的个数
credit.excellentYes=0; //表示训练集中信誉度高并且买了电脑的个数
credit.fairNo=0; //表示训练集信誉度中等并且没买电脑的个数
credit.excellentNo=0; //表示训练集中信誉度高并且没买电脑的个数
buys.yes=0; //表示训练集中所有买电脑的个数
buys.no=0; //表示训练集中所有不买电脑的个数
char strAge[7]; //存储训练集中读入元组的年龄
char strIncome[7]; //存储训练集中读入元组的收入等级
char strStudent[4]; //存储训练集中读入元组是否是学生的状态
char strCredit[10]; //存储训练集中读入元组的信誉度等级
char strBuys[4]; //存储训练集中读入元组是否买了电脑的状态
ifstream in("test"); //读文件,文件中有训练集
if(!in){
cout<<"can not open the file\n";
}
for(int i=1;i<=14;i++){ //训练集中有14条记录,每读一条断断一次
in>>strAge;
in>>strIncome;
in>>strStudent;
in>>strCredit;
in>>strBuys;
if(strcmp(strAge,"<=30")==0&&strcmp(strBuys,"yes")==0){ //判断年龄状态,并将相应的类属性加1
age.lowThirtyYes++;
}else if(strcmp(strAge,"<=30")==0&&strcmp(strBuys,"no")==0){
age.lowThirtyNo++;
}else if(strcmp(strAge,"31...40")==0&&strcmp(strBuys,"yes")==0){
age.betweenthirty_fortyYes++;
}else if(strcmp(strAge,"31...40")==0&&strcmp(strBuys,"no")==0){
age.betweenthirty_fortyNo++;
}else if(strcmp(strAge,">40")==0&&strcmp(strBuys,"yes")==0){
age.highfortyYes++;
}else if(strcmp(strAge,">40")==0&&strcmp(strBuys,"no")==0){
age.highfortyNo++;
}
if(strcmp(strIncome,"high")==0&&strcmp(strBuys,"yes")==0){ //判断收入状态,并将相应的类属性加1
income.highYes++;
}else if(strcmp(strIncome,"high")==0&&strcmp(strBuys,"no")==0){ //判断收入状态,并将相应的类属性加1
income.highNo++;
}else if(strcmp(strIncome,"medium")==0&&strcmp(strBuys,"yes")==0){
income.mediumYes++;
}else if(strcmp(strIncome,"medium")==0&&strcmp(strBuys,"no")==0){
income.mediumNo++;
}else if(strcmp(strIncome,"low")==0&&strcmp(strBuys,"yes")==0){
income.lowYes++;
}else if(strcmp(strIncome,"low")==0&&strcmp(strBuys,"no")==0){
income.lowNo++;
}
if(strcmp(strStudent,"yes")==0&&strcmp(strBuys,"yes")==0){ //判断是否是学生状态,并将相应的类属性加1
student.yesYes++;
}else if(strcmp(strStudent,"yes")==0&&strcmp(strBuys,"no")==0){ //判断是否是学生状态,并将相应的类属性加1
student.yesNo++;
}else if(strcmp(strStudent,"no")==0&&strcmp(strBuys,"yes")==0){
student.noYes++;
}else if(strcmp(strStudent,"no")==0&&strcmp(strBuys,"no")==0){
student.noNo++;
}
if(strcmp(strCredit,"fair")==0&&strcmp(strBuys,"yes")==0){//判断信誉度等级状态,并将相应的类属性加1
credit.fairYes++;
}else if(strcmp(strCredit,"fair")==0&&strcmp(strBuys,"no")==0){//判断信誉度等级状态,并将相应的类属性加1
credit.fairNo++;
}else if(strcmp(strCredit,"excellent")==0&&strcmp(strBuys,"yes")==0){
credit.excellentYes++;
}else if(strcmp(strCredit,"excellent")==0&&strcmp(strBuys,"no")==0){
credit.excellentNo++;
}
if(strcmp(strBuys,"yes")==0){ //判断是否买电脑状态,并将相应的类属性加1
buys.yes++;
}else if(strcmp(strBuys,"no")==0){
buys.no++;
}
}//for 语句结尾
in.close();
while(1){
cout<<"请输入一个事务:\n";
cin>>strAge;
cin>>strIncome;
cin>>strStudent;
cin>>strCredit;
//Y为书上P(X|buys_computer="yes")*P(buys_computer="yes")的值
Y=p(strAge,"yes")*p(strIncome,"yes")*p(strStudent,"yes")*p(strCredit,"yes")*((float)buys.yes/(buys.yes+buys.no));
//N为书上P(X|buys_computer="no")*P(buys_computer="no")的值
N=p(strAge,"no")*p(strIncome,"no")*p(strStudent,"no")*p(strCredit,"no")*((float)buys.no/(buys.yes+buys.no));
if(Y>N){
cout<<"此类事务属于类 yes,即用户会买电脑。";
}else{
cout<<"此类事务属于类 no,即用户不会买电脑。";
}
}//while结尾
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -