Kalzn
文章20
标签13
分类7
基于C++的朴素贝叶斯分类器

基于C++的朴素贝叶斯分类器

基于C++的朴素贝叶斯分类器

github链接 使用c++编写的朴素贝叶斯分类器,其中似然中的离散分量,以及先验概率使用拉普拉斯平滑,连续分量为正态分布。

警告,此代码仅为初学学习之用,请勿用作任何工程项目!

一、跑起来

方式一

使用vscode+cmake插件或者Clion打开目录。然后直接编译运行。

方式二

1、确保安装cmake环境,没有请先装cmake。 2、在工程目录下键入:

1
2
3
4
mkdir build
cd build
cmake ..
make

3、运行build目录下的程序Bayers_classifier程序

二、用起来

1、建立模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Simple_Bayes_Classifier::Info info;
/**
struct Info {
int sample_num; // 样例数量
std::vector<int> header; // 样例格式,
// 如当前分量为离散值则为样例可能取值的数量,
// 如为连续值则填0,
// 例如,现有样例格式为这样 :
// x0 属于 {"东","南","西","北"}
// x1 属于 {"左","右"}
// x2 属于 {x|0<x<100} 为连续值
// 则 header={4, 2, 0}

int class_num; // 分类数量
int sample_size; // 样例分量维度大小
}
*/
Simple_Bayes_Classifier model(info);
2、读取文件,训练模型
1
model.train("data/1.txt"); // 文件格式为:每行一个样例,每个样例n个分量用空格隔开,最后为该样例所属分类
示例文件格式:

3、开始分类, 构造出一个待分类的样例,然后分类结果赋值到样例的belong_to字段

1
2
3
4
Sample s;
s.add_parameter(x); s.add_parameter(y);
model.classify(s);
std::cout << s.belong_to << std::endl;

三、学起来

贝叶斯分类器的基石为Bayes公式:

若现在存在样例的向量为,而其所属分类为的概率为:

其中,我们把称为先验概率(prior),而则为似然(likelihood)而称为证据(evidence)。当分类器工作时,遵循,我们需要比较种分类,选择概率最大的分类。

所以我们可以忽略证据,针对每个待分类的样例,对每种分类计算先验概率和似然即可。

先验概率一般直接进行数量统计,即:

其中为训练集中。所属类别的样例集,而为全体训练集。

而计算较为困难的是似然,在朴素贝叶斯中,我们认为向量的所有分量的取值是独立的,此时有:

此时即可进行运算,这里如果为离散值,则可以直接进行统计:

其中是训练集中满足:所属类别为分量为的集合。

而如果为连续值,则这里可以将其看成正态分布:

其中分别为所属类别为的训练集的分量的方差和均值。

至此我们解决了朴素贝叶斯分类器。

在有些时候,向量的分量不是独立的,一种常见的情况是所有分量满足多维正态分布。为了清晰设置

其中

这里我们将结果取对数

此时有决策函数:

为决策界,当归为类,否则归为。至此,我们讨论了贝叶斯分类器中,样例各分量满足多维正态分布的情况。

本文作者:Kalzn
本文链接:http://kalzncc.github.io/2022/11/19/simple-bayes/
版权声明:除文章中特别注明外,本站所有文章采用 CC BY 3.0 CN 协议进行许可
即在署明文章作者及来源的情况下,您可以将本文用于包括商业目在内的任何用途。
除此之外,本文不做正确性担保,本人不对产生的问题负责。
×