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