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

📄 baye.cpp

📁 一个含有朴素贝耶斯分类方法和决策树分类方法的源代码
💻 CPP
字号:
//********************************************//
//     程序员:巨少辉                          //
//     日期: 2005年11月20日                  //
//     Baye.cpp : implementation file         //
//     实现贝叶斯分类算法                     //
//********************************************//

#include "stdafx.h"
#include "HeartDM.h"
#include "Baye.h"

#include "UserRecordSet.h"
#include "PrepareRecordSet.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBaye

IMPLEMENT_DYNCREATE(CBaye, CListView)

const int num=5;//定义样本的1/3作为测试数据,现在只测试num个
//对变量赋值
CBaye::CBaye()
{
	Sage="";
	Ssex=0;
	Scpt=0;
	Srbp="";
	Ssci="";
	Sfbu=0;
	Srer=0;
	Smhra="";
	Seia=0;
	Sop="";
	Ssope="";
	Snomv="";
	Sthal=0;
 
	RecordCount=DatabeseRecord();
   accurate=DoAccurate();
}

CBaye::~CBaye()
{
}


BEGIN_MESSAGE_MAP(CBaye, CListView)
	//{{AFX_MSG_MAP(CBaye)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBaye drawing

void CBaye::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CBaye diagnostics

#ifdef _DEBUG
void CBaye::AssertValid() const
{
	CListView::AssertValid();
}

void CBaye::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBaye message handlers

//计算数据库表中的记录数
int CBaye::DatabeseRecord()
{
	CPrepareRecordSet m_PrepareRecordSet;
	int Count=0;//记录表中记录数
    //打开数据库表pheart
	try
	{

		if(m_PrepareRecordSet.IsOpen())
			m_PrepareRecordSet.Close();

		m_PrepareRecordSet.Open(CRecordset::snapshot,NULL,CRecordset::none);
		m_PrepareRecordSet.MoveFirst();
		while(!m_PrepareRecordSet.IsEOF())
		{
			Count++;
			m_PrepareRecordSet.MoveNext();
		}
		if(m_PrepareRecordSet.IsOpen())
		{
			m_PrepareRecordSet.Close();
		}
	}
	catch(CDBException *e)
	{
		e->ReportError();
		return -1;
	}
	return Count;
}

//计算贝叶斯算法准确率
float CBaye::DoAccurate()
{
	int i=0;//记录循环数
//	int j=0;
	int count=0;//记录测试样本结论是否和分类一致
	int recordNum=RecordCount*2/3;//记录2/3的样本记录
	int m=0;//记录循环数
	int y_n=0;//记录测试样本中的记录中的y/n属性
	CString midStr[num][7];//导入1/3的测试数据
	float midFloat[num][6];//导入1/3的测试数据
	int midInt[num];//导入1/3的测试数据
	CPrepareRecordSet m_PrepareRecordSet;

	try
	{		
		if(m_PrepareRecordSet.IsOpen())			
			m_PrepareRecordSet.Close();		
		m_PrepareRecordSet.Open(CRecordset::snapshot,_T("select * from pheart"));	
		m_PrepareRecordSet.MoveFirst();	
		while(!m_PrepareRecordSet.IsEOF()&&(i<=recordNum))	
		{			
			m_PrepareRecordSet.MoveNext();			
			i++;		
		}		
		i=0;
	
		while(!m_PrepareRecordSet.IsEOF()&&i<num)
	
		{
			midStr[i][0]=m_PrepareRecordSet.m_page;
			midStr[i][1]=m_PrepareRecordSet.m_prbp;
			midStr[i][2]=m_PrepareRecordSet.m_psci;
			midStr[i][3]=m_PrepareRecordSet.m_pmhra;
			midStr[i][4]=m_PrepareRecordSet.m_pop;
			midStr[i][5]=m_PrepareRecordSet.m_psope;
			midStr[i][6]=m_PrepareRecordSet.m_pnomv;
			midFloat[i][0]=m_PrepareRecordSet.m_psex;
			midFloat[i][1]=m_PrepareRecordSet.m_pcpt;
			midFloat[i][2]=m_PrepareRecordSet.m_pfbu;
			midFloat[i][3]=m_PrepareRecordSet.m_prer;
			midFloat[i][4]=m_PrepareRecordSet.m_peia;
			midFloat[i][5]=m_PrepareRecordSet.m_pthal;
			midInt[i]=m_PrepareRecordSet.m_py_n;
			i++;	
			m_PrepareRecordSet.MoveNext();
		}
		if(m_PrepareRecordSet.IsOpen())		
		{			
			m_PrepareRecordSet.Close();		
		}
	}
			
	catch(CDBException *e)	
	{		
		e->ReportError();	
		return -1;	
	}			
	while(m<i)
	{
		Sage=midStr[m][0];			
		Ssex=midFloat[m][0];			
		Scpt=midFloat[m][1];			
		Srbp=midStr[m][1];			
		Ssci=midStr[m][2];			
		Sfbu=midFloat[m][2];			
		Srer=midFloat[m][3];			
		Smhra=midStr[m][3];			
		Seia=midFloat[m][4];			
		Sop=midStr[m][4];			
		Ssope=midStr[m][5];			
		Snomv=midStr[m][6];			
		Sthal=midFloat[m][5];
		y_n=midInt[m];
        //判断用贝叶斯算法分类结果是否和结论一致,是,则count++
		if(DoBayesianClass()==y_n)
		{
			count++;	
		}
		m++;

	}		
		
	return (float)count/m;//返回准确率

}

//实现贝叶斯算法
int CBaye::DoBayesianClass()
{
	//定义属性名数组
	CString str[]={"age","rbp","sci","mhra","op","sope","nomv","sex","cpt","fbu","rer","eia","thal","y/n"};

	int yn[]={1,2};//定义是否心脏病取值,1为心脏病,2为不是
	CString midStr[7];//分组后属性列取值为字符串的列
	float midFloat[6];//分组后属性列取值为float的列
	
	midStr[0]=Sage;
	midStr[1]=Srbp;
	midStr[2]=Ssci;
	midStr[3]=Smhra;
	midStr[4]=Sop;
	midStr[5]=Ssope;
	midStr[6]=Snomv;
	midFloat[0]=Ssex;
	midFloat[1]=Scpt;
	midFloat[2]=Sfbu;
	midFloat[3]=Srer;
	midFloat[4]=Seia;
	midFloat[5]=Sthal;
	
	float modium[2][13];
	//记录是心脏病的概率和不是心脏病的概率
	float result[2]={1.0,1.0};
	int i,j;
	for(i=0;i<2;i++)
	{
		for(j=0;j<13;j++)
		{
			if(j<=6)
			{
				modium[i][j]=findItem(str[j],midStr[j],yn[i])/findItem(str[13],yn[i]);
			}
			else
			{
				modium[i][j]=findItem(str[j],midFloat[j-7],yn[i])/findItem(str[13],yn[i]);
			}

		}
	}
	for(i=0;i<2;i++)
	{
		for(j=0;j<13;j++)
		{
			result[i]*=modium[i][j];
		}
		result[i]*=findItem(str[13],yn[i])/RecordCount;
	}
	if(result[0]>result[1])
	{
		return 1;//确定是心脏病患者
	}
	else if(result[0]==result[1])
	{
		return -1;//不能确定是否心脏病患者
	}
	else return 2;//确定不是心脏病患者

}

//分层后属性列取值为CString的列,列名colName,列值为str并且y/n属性为y_n的概率
float  CBaye::findItem(CString colName,CString str,int y_n)
{
	int recordNum=RecordCount*2/3;
	int i=0;
	int count=0;
	CPrepareRecordSet m_prepareRecordSet;
	try
	{
		if(m_prepareRecordSet.IsOpen())					
			m_prepareRecordSet.Close();	
		m_prepareRecordSet.Open(CRecordset::snapshot,_T("select * from pheart"));
		m_prepareRecordSet.MoveFirst();	
		while(!m_prepareRecordSet.IsEOF()&&m_prepareRecordSet.IsOpen())
		{		
			if(i>recordNum)
			{
				break;
			}
			i++;
			if((colName=="age")&&(str==m_prepareRecordSet.m_page)&&(y_n==m_prepareRecordSet.m_py_n))		
			{			
				count++;		
			}		
			else if((colName=="rbp")&&(str==m_prepareRecordSet.m_prbp)&&(y_n==m_prepareRecordSet.m_py_n))		
			{			
				count++;		
			}		
			else if((colName=="sci")&&(str==m_prepareRecordSet.m_psci)&&(y_n==m_prepareRecordSet.m_py_n))		
			{			
				count++;		
			}		
			else if((colName=="mhra")&&(str==m_prepareRecordSet.m_pmhra)&&(y_n==m_prepareRecordSet.m_py_n))		
			{			
				count++;		
			}		
			else if((colName=="op")&&(str==m_prepareRecordSet.m_pop)&&(y_n==m_prepareRecordSet.m_py_n))
			{			
				count++;		
			}
		
			else if((colName=="sope")&&(str==m_prepareRecordSet.m_psope)&&(y_n==m_prepareRecordSet.m_py_n))
		
			{			
				count++;		
			}
		
			else if((colName=="nomv")&&(str==m_prepareRecordSet.m_pnomv)&&(y_n==m_prepareRecordSet.m_py_n))
		
			{			
				count++;		
			}

			m_prepareRecordSet.MoveNext();
		}
		if(m_prepareRecordSet.IsOpen())
		{
			m_prepareRecordSet.Close();
		}
	}
	catch(CDBException *e)
	{
		e->ReportError();
		return 1;
	}
	return (float)count;

}

//分层后属性列取值为float的列,列名colName列值为col并且y/n属性为y_n的概率
float  CBaye::findItem(CString colName,float col,int y_n)
{
	int count=0;
	int recordNum=RecordCount*2/3;
	int i=0;
	CPrepareRecordSet m_prepareRecordSet;
	try
	{
		if(m_prepareRecordSet.IsOpen())					
			m_prepareRecordSet.Close();	
		m_prepareRecordSet.Open(CRecordset::snapshot,_T("select * from pheart"));
		m_prepareRecordSet.MoveFirst();	
		while(!m_prepareRecordSet.IsEOF()&&m_prepareRecordSet.IsOpen())
		{
		
			if(i>recordNum)			
			{
				break;
			}
			i++;
			if((colName=="sex")&&(col==m_prepareRecordSet.m_psex)&&(y_n==m_prepareRecordSet.m_py_n))		
			{			
				count++;		
			}		
			else if((colName=="cpt")&&(col==m_prepareRecordSet.m_pcpt)&&(y_n==m_prepareRecordSet.m_py_n))		
			{			
				count++;		
			}		
			else if((colName=="fbu")&&(col==m_prepareRecordSet.m_pfbu)&&(y_n==m_prepareRecordSet.m_py_n))		
			{			
				count++;		
			}		
			else if((colName=="rer")&&(col==m_prepareRecordSet.m_prer)&&(y_n==m_prepareRecordSet.m_py_n))		
			{			
				count++;		
			}		
			else if((colName=="eia")&&(col==m_prepareRecordSet.m_peia)&&(y_n==m_prepareRecordSet.m_py_n))
			{			
				count++;		
			}
		
			else if((colName=="thal")&&(col==m_prepareRecordSet.m_pthal)&&(y_n==m_prepareRecordSet.m_py_n))
		
			{			
				count++;		
			}
		
			m_prepareRecordSet.MoveNext();
		}
		if(m_prepareRecordSet.IsOpen())
		{
			m_prepareRecordSet.Close();
		}
	}
	catch(CDBException *e)
	{
		e->ReportError();
		return 1;
	}
	return (float)count;

}

//DEL float  CBaye::findItem(CString colName,CString str)
//DEL {
//DEL 	int count=0;
//DEL 	int recordNum=RecordCount*2/3;
//DEL 	int i=0;
//DEL 	CPrepareRecordSet m_prepareRecordSet;
//DEL 	try
//DEL 	{
//DEL 		if(m_prepareRecordSet.IsOpen())					
//DEL 			m_prepareRecordSet.Close();	
//DEL 		m_prepareRecordSet.Open(CRecordset::snapshot,_T("select * from pheart"));
//DEL 		m_prepareRecordSet.MoveFirst();	
//DEL 		while(!m_prepareRecordSet.IsEOF())
//DEL 		{		
//DEL 			if(i>recordNum)			
//DEL 			{
//DEL 				break;
//DEL 			}
//DEL 			i++;			
//DEL 			if(colName=="age"&&str==m_prepareRecordSet.m_page)		
//DEL 			{			
//DEL 				count++;		
//DEL 			}		
//DEL 			else if(colName=="rbp"&&str==m_prepareRecordSet.m_prbp)		
//DEL 			{			
//DEL 				count++;		
//DEL 			}		
//DEL 			else if(colName=="sci"&&str==m_prepareRecordSet.m_psci)		
//DEL 			{			
//DEL 				count++;		
//DEL 			}		
//DEL 			else if(colName=="mhra"&&str==m_prepareRecordSet.m_pmhra)		
//DEL 			{			
//DEL 				count++;		
//DEL 			}		
//DEL 			else if(colName=="op"&&str==m_prepareRecordSet.m_pop)
//DEL 			{			
//DEL 				count++;		
//DEL 			}
//DEL 		
//DEL 			else if(colName=="sope"&&str==m_prepareRecordSet.m_psope)
//DEL 		
//DEL 			{			
//DEL 				count++;		
//DEL 			}
//DEL 		
//DEL 			else if(colName=="nomv"&&str==m_prepareRecordSet.m_pnomv)
//DEL 		
//DEL 			{			
//DEL 				count++;		
//DEL 			}
//DEL 
//DEL 			m_prepareRecordSet.MoveNext();
//DEL 		}
//DEL 		if(m_prepareRecordSet.IsOpen())
//DEL 		{
//DEL 			m_prepareRecordSet.Close();
//DEL 		}
//DEL 	}
//DEL 	catch(CDBException *e)
//DEL 	{
//DEL 		e->ReportError();
//DEL 		return -1;
//DEL 	}
//DEL 	return (float)count;
//DEL }

//计算2/3样本中属性y_n=col的数量
float  CBaye::findItem(CString colName,int col)
{
	int count=0;
	int recordNum=RecordCount*2/3;
	int i=0;
	CPrepareRecordSet m_prepareRecordSet;
	try
	{
		if(m_prepareRecordSet.IsOpen())					
			m_prepareRecordSet.Close();	
		m_prepareRecordSet.Open(CRecordset::snapshot,_T("select * from pheart"));
		m_prepareRecordSet.MoveFirst();	
		while(!m_prepareRecordSet.IsEOF()&&m_prepareRecordSet.IsOpen())
		{
			if(i>recordNum)			
			{
				break;
			}
			i++;
/*			if((colName=="sex")&&(col==m_prepareRecordSet.m_psex))		
			{			
				count++;		
			}		
			else if((colName=="cpt")&&(col==m_prepareRecordSet.m_pcpt))		
			{			
				count++;		
			}		
			else if((colName=="fbu")&&(col==m_prepareRecordSet.m_pfbu))		
			{			
				count++;		
			}		
			else if((colName=="rer")&&(col==m_prepareRecordSet.m_prer))		
			{			
				count++;		
			}		
			else if((colName=="eia")&&(col==m_prepareRecordSet.m_peia))
			{			
				count++;		
			}
		
			else if((colName=="thal")&&(col==m_prepareRecordSet.m_pthal))
		
			{			
				count++;		
			}*/
			if((colName=="y/n")&&(col==m_prepareRecordSet.m_py_n))
		
			{			
				count++;		
			}		
			m_prepareRecordSet.MoveNext();
		}
		if(m_prepareRecordSet.IsOpen())
		{
			m_prepareRecordSet.Close();
		}
	}
	catch(CDBException *e)
	{
		e->ReportError();
		return -1;
	}
	return (float)count;
}

//对输入记录分层
void CBaye::DoLayer(int age, int sex, int cpt, float rbp, float sci, int fbu, int rer, float mhra, int eia, float op, float sope, float nomv, int thal)
{
	if(age<=40)
	{
		Sage="<=40";

	}
	else if(age>40&&age<60)
	{
		Sage="40..60";

	}
	else if(age>=60)
	{
		Sage=">=60";
	}

	Ssex=(float)sex;

	if(cpt>4)
	{	
		Scpt=4;
	}
	else if(cpt<1)
	{
		Scpt=1;
	}
	else
	{
		Scpt=cpt;
	}
	if(rbp<=120)
	{
		Srbp="<=120";

	}
	else if(rbp>120&&rbp<=140)
	{
		Srbp="120..140";

	}
	else if(rbp>140&&rbp<=160)
	{
		Srbp="140..160";
	}
	else if(rbp>160&&rbp<180)
	{
		Srbp="160..180";
	}
	else
	{
		Srbp=">=180";
	}

	if(sci<=205)
	{
		Ssci="<=205";
	}
	else if(sci>205&&sci<=270)
	{
		Ssci="205..270";

	}
	else if(sci>270&&sci<340)
	{
		Ssci="270..340";

	}
	else
	{
		Ssci="<=340";
	}
	Sfbu=fbu;
	Srer=rer;

	if(mhra<=95)
	{
		Smhra="<=95";
	}
	else if(mhra>95&&mhra<=120)
	{
		Smhra="90..120";

	}
	else if(mhra>120&&mhra<=144)
	{
		Smhra="120..144";

	}
	else if(mhra>144&&mhra<168)
	{
		Smhra="144..168";

	}
	else
	{
		Smhra=">=168";
	}

	Seia=eia;
	if(op<=2)
	{
		Sop="<=2";
	}
	else if(op>2&&op<4)
	{
		Sop="2..4";

	}
	else
	{
		Sop=">=4";
	}

	if(sope<=1.6)
	{				
		Ssope="1";
	}
	else if(sope<2.3&&sope>1.6)
	{
		Ssope="2";
	}
	else
	{
		Ssope="3";
	}

	if(nomv<=0.75)
	{
		Snomv="0";
	}
	else if(nomv>0.75&&nomv<=1.5)
	{
		Snomv="1";
	}
	else if(nomv>1.5&&nomv<2.25)
	{
		Snomv="2";			
	}
	else
	{
		Snomv="3";			
	}
	Sthal=thal;
}

//DEL CString CBaye::Ssci()
//DEL {
//DEL 
//DEL }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -