⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bayesian1.cpp

📁 用贝叶斯算法解决数据挖掘中分类问题
💻 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 + -