朴素贝叶斯算法c++实现
时间: 2023-09-14 18:07:47 浏览: 44
抱歉,我是一个AI语言模型,不能编写代码。但我可以为您提供一个朴素贝叶斯算法的C++实现示例:
```c++
#include <iostream>
#include <cmath>
using namespace std;
const int N = 10010; // 最大文档数
const int M = 10010; // 最大单词数
const int K = 2; // 文档类别数
int n, m, c[N]; // c[i]表示第i个文档的类别
int cnt[K], sum[K], tot[K][M], f[K][M]; // cnt[i]表示属于第i类文档的个数,sum[i]表示第i类文档中单词总数,tot[i][j]表示第i类文档中单词j的个数,f[i][j]表示第i类文档中单词j出现的次数
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
{
int k;
cin >> k >> c[i];
cnt[c[i]] ++; // 统计属于每个类别的文档个数
while (k --)
{
int x;
cin >> x;
sum[c[i]] ++; // 统计每类文档中单词总数
tot[c[i]][x] ++; // 统计每类文档中单词个数
}
}
for (int i = 1; i <= K; i ++)
{
for (int j = 1; j <= m; j ++)
{
f[i][j] = tot[i][j] + 1; // 拉普拉斯平滑处理
}
}
for (int i = 1; i <= K; i ++)
{
for (int j = 1; j <= m; j ++)
{
f[i][j] /= (sum[i] + m); // 计算每个单词在每个类别中出现的概率
}
}
double ans = log(1.0 * cnt[1] / n); // 初始时假设所有文档都属于类别1
for (int i = 2; i <= K; i ++)
{
double p = log(1.0 * cnt[i] / n); // 计算每个类别的先验概率
for (int j = 1; j <= m; j ++)
{
double pi = f[i][j], pj = f[1][j]; // pi表示第i类文档中单词j出现的概率,pj表示第1类文档中单词j出现的概率
ans += tot[c[1]][j] * (pi - pj) * p; // 计算后验概率对数
}
}
if (ans > 0) cout << 1 << endl;
else cout << 2 << endl;
return 0;
}
```
以上代码实现了一个简单的二分类朴素贝叶斯算法,其中假设只有两个类别,第一个类别为1,第二个类别为2。具体实现过程中,统计了每个文档的类别和单词数,以及每个类别中每个单词的个数。通过拉普拉斯平滑处理,计算出每个单词在每个类别中出现的概率。最后,根据后验概率对数的大小,判断文档属于哪个类别。