您的位置:首页 > 其它

朴素贝叶斯分类器(没什么价值,作为路标留给自己看)

2010-05-23 16:51 218 查看
/****************************
//朴素贝叶斯算法实现文档分类。
//高级人工智能第二次作业。
//P.S. 炼狱般的升华啊,
//平均十行程序,
//才能有一行留到最后。
// CodeAnt Koo,2010-4-22
****************************/

/*编程日志:
21:33 2010-4-09 统计Example信息。
17:05 2010-4-10 记录概率项。
08:16 2010-4-12 计算概率项。
10:40 2010-4-12 编写Learn_Naive_Bayes_Text函数。
10:47 2010-4-13 编写Max函数返回数组最大值。
10:49 2010-4-13 编写Classify_Naive_Bayes_Text函数,返回文档目标值。
16:46 2010-4-13 调试程序。编译报错。
21:06 2010-4-13 修改Length函数。
21:24 2010-4-13 放弃Length函数。
08:25 2010-4-14 修改Max函数。
09:02 2010-4-14 Length函数编译通过,结果错误,还是放弃。
09:52 2010-4-14 修改Classify_Naive_Bayes_Text函数。不能返回数组。
10:24 2010-4-14 函数内数组赋值报错。
10:34 2010-4-14 函数形参……OMG。
10:46 2010-4-14 公式演算,参数类型不匹配。
10:59 2010-4-14 修改Classify_Naive_Bayes_Text函数。编译通过。
18:27 2010-4-14 分离VocaCount函数。编译通过。
21:30 2010-4-14 分离RecN函数。编译通过。
21:30 2010-4-14 在main函数中调用,报错redefinition; different basic types。
21:34 2010-4-14 在main函数中调用,编译通过。
09:24 2010-4-15 修改数值型数组结束标志。
09:27 2010-4-15 分离CompuN函数。编译通过。
09:53 2010-4-15 第一次写完。编译查错。
16:01 2010-4-15 计算公式处报错。拆成两步计算。
16:25 2010-4-15 函数重定义?
16:46 2010-4-15 先定义后调用……子啊带我走吧~
16:51 2010-4-15 第一次全程序编译通过。调试崩溃。
10:56 2010-4-17 调试Judge函数。程序崩溃~莫名其妙~道可道非常道~
08:51 2010-4-18 再次调试,再次崩溃。原本可以的程序都崩溃了。
15:59 2010-4-22 修改Max函数。
16:15 2010-4-22 修正Judge函数。
19:25 2010-4-22 重写getVoca函数。崩溃。放弃。
21:23 2010-4-22 重写getWord函数。
21:52 2010-4-22 重新调试,通过。
15:37 2010-4-24 修正求和函数。
19:28 2010-4-24 测试程序。
21:44 2010-4-25 重写注释。
14:23 2010-4-26 添加训练功能。
*/

#include <stdio.h>
#include <string.h>

/***************输出数组最大值********************/
float MaxValue(float *a)
{
float temp; //暂存最大值
int i=0; //循环变量

//temp始终指向当前最大值
for (i=0;i<sizeof(*a);i++)
{
if(temp<(*(a+i)))
{
temp=(*(a+i));
}
}
return temp;
}

/********************统计文档单词******************/
void getVoca(char *Example,int *numVoca,char *Voca)
{
int i; //循环变量
int j; //循环变量

for(i=0;i<30;i++)
{
for(j=0;j<30;j++)
{
//若该单词已存在于文档子集,则对应计数自加1
if(*(Voca+j)==*(Example+i))
{
*(numVoca+j) = (*(numVoca+j)+1);
break;

}

//若循环结束仍未在文档子集中找到该单词,
//则说明该单词是第一次出现;
//将该单词插入文档子集结束处,
//对应计数设为1,
//并扩展文档集长度。
else
{
*(Voca+j+1)=*(Example);
*(numVoca+j+1)=1;
break;
}

}
//*(Voca+j+2)='*'; //数组结束标记
}
}

/******************统计"敏感词汇"*******************/
void getWord(char *Example, char *Vfinance,int *numfinance)
{
int i; //循环变量
int j; //循环变量

for(j=0;*(Vfinance+j)!='/0';j++)
{
for(i=0;*(Example+i)!='/0';i++)
{
//若该单词是目标值,则对应计数自加1
if(*(Example+i)==*(Vfinance+j))
{
*(numfinance+j)=(*(numfinance+j)+1);
}
}
}
}

/********************文档分类*********************/
void Judge(float max,char *Class)
{
//输出概率值
printf("The probability of this article to be %s is :%f/n",Class,max);
//根据阈值判断分类
if (max>0.01)
{
printf("The document's classify is %s./n",Class);
}
else
{
printf("The document's classify is not %s./n",Class);
}
}

/*****************数组求和********************/
int Analyze(int *numfinance,int *wFinance)
{
int i; //循环变量
int sumfinance=0; //暂存当前总和

for(i=0;i<30;i++)
{
sumfinance = sumfinance+numfinance[i]*wFinance[i];
}

return sumfinance;
}

/*******************求概率**********************/
float pWord(int sumWord)
{
float PWord;

PWord=(float)sumWord/30;

return PWord;
}

/*****************使用分类功能*****************/
void useClass(char *Example, char *classfinance,char *classmail,int *wFinance,int *wMail,char *Vfinance,char *Vmail,int *numfinance,int *nummail,int sumfinance,int summail,float pfinance,float pmail)
{
//提示输入待分类文档,保存
printf("Please input the article you want to classify.No more than 30 letters./n");
scanf("%s",Example);

//输出已获得的文本信息,及使用的目标值
printf("*********************/n");
printf("Information:/n");
printf("Example is:%s/n",Example);
printf("Vfinance was:%s/n",Vfinance);
printf("Vmail was:%s/n",Vmail);
printf("*********************/n");
printf("Result:/n");

//获得文档子集及计数
getWord(Example, Vfinance,numfinance);
getWord(Example, Vmail,nummail);

//求和,获取对应目标数组总计数
sumfinance=Analyze(numfinance,wFinance);
summail=Analyze(nummail,wMail);

//求相应概率
pfinance=pWord(sumfinance);
pmail=pWord(summail);

//判断分类
Judge(pfinance,classfinance);
Judge(pmail,classmail);
}
/*******************主程序*********************/
main()
{
char Example[30]; //储存待分类的文本

char classfinance[]={"Finance"}; //分类名:Finance
char classmail[]={"Mail"}; //分类名:Mail

int wFinance[30]={1,1}; //设置训练集元素权重,默认为1
int wMail[30]={1}; //设置训练集元素权重,默认为1

char Vfinance[30]={"$%"}; //Finance类的目标值
char Vmail[30]={"@"}; //Mail类的目标值

int numfinance[30]={0}; //Finance类目标值对应的计数值
int nummail[30]={0}; //Mail类目标值对应的计数值

int sumfinance=0; //Finance类所有目标值的计数值综合
int summail; //Mail类所有目标值的计数值综合

float pfinance={0.0}; //设定属于Finance类的概率初值
float pmail={0.0}; //设定属于Mail类的概率初值

//提示用户选择程序功能:分类/训练
printf("Train first(Type 'T') or classify derectly?(type any letter)");
if(getchar()=='T') //训练
{
//提示输入训练文档,保存
printf("Please input the article you want to classify.No more than 30 letters./n");
scanf("%s",Example);

//提示输入文档类型
printf("Please input the class of the article. Finance or Mail.(F/M)/n");

//根据文档类型修改训练集
if(getchar()=='F')
{
//修改训练集
getVoca(Example,wFinance,Vfinance);

}
else if(getchar()=='M')
{
//修改训练集
getVoca(Example,wMail,Vmail);

}
}

//分类
useClass(Example,classfinance,classmail,wFinance,wMail,Vfinance,Vmail,numfinance,nummail,sumfinance,summail,pfinance,pmail);

//程序结束
printf("*********************/n");
printf("--------THE END---------/n/n/n/n");
printf("Press any key to exit./n");

//保持输出界面
system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐