C++ 语言 实现朴素贝叶斯分类器

C++阿木 发布于 2025-06-14 22 次阅读


朴素贝叶斯分类器在C++中的实现

朴素贝叶斯分类器是一种基于贝叶斯定理与特征条件独立假设的分类方法。它广泛应用于文本分类、情感分析等领域。本文将围绕C++语言,详细阐述朴素贝叶斯分类器的原理,并给出一个完整的实现示例。

一、朴素贝叶斯分类器原理

朴素贝叶斯分类器基于以下假设:

1. 特征条件独立性假设:即假设每个特征与其他特征之间相互独立。
2. 贝叶斯定理:P(A|B) = P(B|A) P(A) / P(B)。

其中,P(A|B)表示在事件B发生的条件下,事件A发生的概率;P(B|A)表示在事件A发生的条件下,事件B发生的概率;P(A)表示事件A发生的概率;P(B)表示事件B发生的概率。

在分类问题中,我们通常将特征表示为X,类别表示为Y,那么朴素贝叶斯分类器的目标是:

1. 计算每个类别的先验概率P(Y)。
2. 计算每个类别下每个特征的联合概率P(X|Y)。
3. 根据贝叶斯定理,计算每个类别下X的概率P(X|Y) P(Y)。
4. 选择概率最大的类别作为预测结果。

二、C++实现

以下是一个简单的朴素贝叶斯分类器C++实现示例:

cpp
include
include
include
include
include

using namespace std;

// 数据结构定义
struct Data {
vector features;
string label;
};

// 朴素贝叶斯分类器
class NaiveBayesClassifier {
private:
map priorProbability; // 类别先验概率
map<#string, map> likelihood; // 类别下特征的联合概率

public:
// 训练模型
void train(const vector& trainData) {
// 计算先验概率
for (const auto& data : trainData) {
priorProbability[data.label]++;
}
for (auto& prob : priorProbability) {
prob.second /= trainData.size();
}

// 计算联合概率
for (const auto& data : trainData) {
for (const auto& feature : data.features) {
likelihood[data.label][feature]++;
}
}
for (auto& prob : likelihood) {
for (auto& featureProb : prob.second) {
featureProb.second /= trainData.size();
}
}
}

// 预测
string predict(const vector& features) {
double maxProbability = -numeric_limits::max();
string predictedLabel;
for (const auto& label : priorProbability) {
double probability = log(priorProbability[label]) + logProduct(features, likelihood[label.second]);
if (probability > maxProbability) {
maxProbability = probability;
predictedLabel = label.first;
}
}
return predictedLabel;
}

private:
// 计算多个概率的乘积
double logProduct(const vector& probabilities) {
double product = 1.0;
for (const auto& prob : probabilities) {
product = prob;
}
return log(product);
}
};

int main() {
// 示例数据
vector trainData = {
{ {1.0, 2.0}, "A" },
{ {2.0, 3.0}, "A" },
{ {3.0, 4.0}, "B" },
{ {4.0, 5.0}, "B" }
};

// 创建朴素贝叶斯分类器实例
NaiveBayesClassifier nbClassifier;

// 训练模型
nbClassifier.train(trainData);

// 测试数据
vector testData = { 2.0, 3.0 };

// 预测
string predictedLabel = nbClassifier.predict(testData);
cout << "Predicted label: " << predictedLabel << endl;

return 0;
}

三、总结

本文介绍了朴素贝叶斯分类器的原理,并给出一个简单的C++实现示例。在实际应用中,朴素贝叶斯分类器可以进一步优化,例如处理缺失值、特征选择、超参数调整等。希望本文对您有所帮助。