用c语言代码实现贝叶斯分类算法
时间: 2023-10-29 10:04:47 浏览: 129
python基于概率论的分类算法 朴素贝叶斯原理简单,也很容易实现,多用于文本分类
贝叶斯分类算法是一种基于概率统计的分类方法,它的核心思想是利用已知的先验概率和条件概率推导出后验概率,进而进行分类。
以下是用C语言代码实现贝叶斯分类算法的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX_DOC_NUM 1000 // 最大文档数
#define MAX_WORD_NUM 100 // 最大单词数
#define MAX_CLASS_NUM 10 // 最大类别数
char doc[MAX_DOC_NUM][MAX_WORD_NUM][20]; // 存储文档中的单词
int class[MAX_DOC_NUM]; // 存储文档所属的类别
int doc_num = 0; // 文档数
int word_num[MAX_CLASS_NUM] = {0}; // 每个类别中单词总数
int total_word_num = 0; // 所有类别中单词总数
int word_frequency[MAX_CLASS_NUM][MAX_WORD_NUM] = {0}; // 每个类别中每个单词出现的次数
double prior_probability[MAX_CLASS_NUM]; // 每个类别的先验概率
double conditional_probability[MAX_CLASS_NUM][MAX_WORD_NUM]; // 每个类别中每个单词的条件概率
// 读取文档
void read_doc(const char *filename) {
FILE *fp = fopen(filename, "r");
char word[20];
int i = 0, j = 0;
while (fscanf(fp, "%s", word) != EOF) {
if (strcmp(word, "#") == 0) {
i++;
j = 0;
} else {
strcpy(doc[i][j], word);
j++;
}
}
doc_num = i;
fclose(fp);
}
// 统计单词数量
void count_word_num() {
for (int i = 0; i < doc_num; i++) {
int c = class[i];
for (int j = 0; j < MAX_WORD_NUM; j++) {
if (strlen(doc[i][j]) == 0) break;
strcpy(doc[c][word_num[c]], doc[i][j]);
word_num[c]++;
total_word_num++;
}
}
}
// 统计单词频率
void count_word_frequency() {
for (int i = 0; i < doc_num; i++) {
int c = class[i];
for (int j = 0; j < MAX_WORD_NUM; j++) {
if (strlen(doc[i][j]) == 0) break;
for (int k = 0; k < word_num[c]; k++) {
if (strcmp(doc[i][j], doc[c][k]) == 0) {
word_frequency[c][k]++;
break;
}
}
}
}
}
// 计算先验概率
void calculate_prior_probability() {
for (int i = 0; i < MAX_CLASS_NUM; i++) {
prior_probability[i] = (double)word_num[i] / total_word_num;
}
}
// 计算条件概率
void calculate_conditional_probability() {
for (int i = 0; i < MAX_CLASS_NUM; i++) {
for (int j = 0; j < word_num[i]; j++) {
conditional_probability[i][j] = (double)(word_frequency[i][j] + 1) / (word_num[i] + MAX_WORD_NUM);
}
}
}
// 预测文档所属的类别
int predict(const char *doc_str) {
char word[20];
int i = 0, j = 0;
while (*doc_str != '\0') {
if (*doc_str == ' ') {
word[i] = '\0';
i = 0;
for (int k = 0; k < MAX_CLASS_NUM; k++) {
for (int l = 0; l < word_num[k]; l++) {
if (strcmp(word, doc[k][l]) == 0) {
j = k;
break;
}
}
if (j != 0) break;
}
if (j != 0) break;
} else {
word[i] = *doc_str;
i++;
}
doc_str++;
}
return j;
}
int main() {
// 读取文档和类别
read_doc("doc.txt");
FILE *fp = fopen("class.txt", "r");
for (int i = 0; i < doc_num; i++) {
fscanf(fp, "%d", &class[i]);
}
fclose(fp);
// 统计单词数量和频率
count_word_num();
count_word_frequency();
// 计算先验概率和条件概率
calculate_prior_probability();
calculate_conditional_probability();
// 预测文档所属的类别
char doc_str[100];
printf("请输入文档:\n");
gets(doc_str);
int c = predict(doc_str);
printf("文档属于类别%d\n", c);
return 0;
}
```
需要注意的是,这里的文档和类别是从文件中读取的,文档中的单词以空格分隔,每个文档以`#`作为分隔符。类别按照文档的顺序依次存储在文件中。当然,你也可以通过其他方式获取文档和类别。
这段代码实现了贝叶斯分类算法的基本流程,但是它还有很多可以改进的地方,比如对于一些出现频率极低的单词可以进行过滤,以提高算法的效率和准确率。
阅读全文