📄 baye.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 + -