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

📄 bn_naviebayesianclassifier.cpp

📁 朴素贝叶斯分类器(Navie Bayesian Classifier)识别鼠标输入的字母A~J
💻 CPP
字号:
// BN_NavieBayesianClassifier.cpp: implementation of the CBN_NavieBayesianClassifier class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "AI.h"
#include "BN_NavieBayesianClassifier.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBN_NavieBayesianClassifier::CBN_NavieBayesianClassifier()
{

}

CBN_NavieBayesianClassifier::~CBN_NavieBayesianClassifier()
{

}

CBN_NavieBayesianClassifier::CBN_NavieBayesianClassifier(
		struct	TypeClass *C,	int M, 
		/*int		*X,	*/			int	N,
		struct	TypeSample *S,	int	Q
){
	int i,j;

	this->M=M;
	this->N=N;
	this->Q=Q;

	this->C=(struct	TypeClass*) calloc(M, sizeof(struct	TypeClass));
	for(i=0; i<M; i++)
	{
		this->C[i].Class=C[i].Class;
		this->C[i].Word=new CString(*C[i].Word);
	}


	this->S=(struct	TypeSample*) calloc(Q, sizeof(struct	TypeSample));
	for(i=0; i<Q; i++)
	{
		this->S[i].sample=(int *) calloc(N, sizeof(int));
		for(j=0; j<N; j++)
			(this->S[i].sample)[j]=(S[i].sample)[j];
		this->S[i].Class=S[i].Class;
	}

	this->proC=(double*) calloc(M, sizeof(double));
	this->proConditionC=(double***) calloc(M, sizeof(double**));
	for(i=0; i<M; i++)
	{
		proC[i]=0;
		proConditionC[i]=(double**) calloc(N, sizeof(double*));
		for(j=0; j<N; j++)
		{
			proConditionC[i][j]=(double*) calloc(2, sizeof(double));
			proConditionC[i][j][0]=0;
			proConditionC[i][j][1]=0;
		}
	}

	this->pCi=(double*) calloc(M, sizeof(double));
	this->pArgCi=(int*) calloc(M, sizeof(int));

}

void CBN_NavieBayesianClassifier::Study()
{
	int i,j;
	for(i=0; i<Q; i++)
	{
		proC[ S[i].Class ]++;
		for(j=0; j<N; j++)
		{
			if(S[i].sample[j]==1)
				proConditionC[ S[i].Class ][j][1]++;
			else
				proConditionC[ S[i].Class ][j][0]++;
		}
	}

	for(i=0; i<M; i++)
	{
		for(j=0; j<N; j++)
		{
			proConditionC[i][j][1]=(proConditionC[i][j][1]+1.0)/(proC[i]+2);
			proConditionC[i][j][0]=(proConditionC[i][j][0]+1.0)/(proC[i]+2);
		}
		proC[i]=(proC[i]+1.0)/(Q+M);
	}
}

CString CBN_NavieBayesianClassifier::Work(int *sample)
{
	int i,j;
	double sum=0;
	for(i=0; i<M; i++){
		pCi[i]=proC[i];
		pArgCi[i]=i;
		
	}
	for(i=0; i<M; i++){
		for(j=0; j<N; j++){
			if(sample[j]==1)
				pCi[i]=pCi[i]*proConditionC[i][j][1];
			else
				pCi[i]=pCi[i]*proConditionC[i][j][0];
		}
		sum+=pCi[i];
		
	}	

	double temp;
	int    argtmp;
	for(i=0; i<M-1; i++){
		for(j=i+1; j<M; j++){
			if(pCi[i]<pCi[j]){
				temp=pCi[i];	argtmp=pArgCi[i];
				pCi[i]=pCi[j];	pArgCi[i]=pArgCi[j];
				pCi[j]=temp;	pArgCi[j]=argtmp;
			}
		}	
	}

	//***************************************************
	CString	s,sPro;
	for(i=0; i<M; i++){
		s.Format("P(\"%s\")=%6f\r\n",*(C[pArgCi[i]].Word),pCi[i]/sum);
		sPro+=s;
	}
	
	//***************************************************

	return *(C[ pArgCi[0] ].Word)+sPro;
}

void CBN_NavieBayesianClassifier::ToFile(CString csFileName)
{
	int i,j;
	CString	s,sPro;
	CTime	time=CTime::GetCurrentTime();
	sPro=time.Format("<font color=#FF0000>NavieBayesianClassifier<br>记录时间  %Y-%m-%d %H:%M:%S</font><br><br>" );
	sPro+="<font color=#0000FF>";
	sPro+="本朴素贝叶斯分类器用于识别手写的数字A~J.<br>";
	sPro+="类别空间C=(\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\").<br>";
	s.Format("属性空间X=%d个格子.<br>",N);
	sPro+=s;
	sPro+="属性的值域=(+1,-1),分别表示填充与未填充.<br>";
	sPro+="训练样本空间S=((\"A\"的掩模,0),(\"B\"的掩模<后同>,1),(\"C\",2),(\"D\",3),(\"E\",4),(\"F\",5),(\"G\",6),(\"H\",7),(\"I\",8),(\"J\",9)).<br>";
	s.Format("训练结果为%d个类概率和%d*%d*%d=%d个类条件概率.",M,M,N,2,M*N*2);
	sPro+=s;
	sPro+="</font>";
	sPro+="<br>";
	sPro+="<br>";


	sPro+="<hr>类概率:<br>";
	for(i=0; i<M; i++){
		s.Format("P(C%d)=%f\t",i,proC[i]);
		sPro+=s;
		sPro+="<br>";

	}

	sPro+="<br><hr>类条件概率:<br>";
	for(i=0; i<M; i++){
		for(j=0; j<N; j++){
			s.Format("P(X%d=-1|C%d=\"%s\")=%f\t",j,i,*(C[i].Word),proConditionC[i][j][0]);
			//::AfxMessageBox(s);
			sPro+=s;
			s.Format("P(X%d= 1|C%d=\"%s\")=%f\t",j,i,*(C[i].Word),proConditionC[i][j][1]);
			sPro+=s;
			sPro+="<br>";

		}
		sPro+="<br>";
	}

	CStdioFile out;
	out.Open(csFileName, CFile::modeCreate | CFile::modeWrite);
	out.WriteString(sPro);
	out.Close();
}

CString CBN_NavieBayesianClassifier::GetSample(int SamNum)
{
	return *(C[ S[SamNum].Class ].Word);
}

⌨️ 快捷键说明

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