简洁明了的搭建 NB朴素贝叶斯 仅公式无推导

网上关于机器学习算法的讲解很多,不过推导过程可能比较繁琐,结论比较隐蔽。为了能够让c/c++的初学者通过代码简单的实现、加深理解,所以本文章简单的总结出结论,尽量减少推导过程。并且将各个变量的范围、意义做出解释。

我目前大学本科在读,非人工智能专业,第一次接触机器学习,本文章仅是我的学习记录和总结,所有的处理方式都不一定是最正确的。但是致力于让只学完c\c++基本语法的人也能实现该算法。

不知道怎么处理数据、得到“输入”的请看我的文章:《机器学习数据的预处理》(如果找不到说明我还没写)。

另外,我会尽可能多打括号,防止各位对\sum到底对什么求和感到困惑,变量也用x[a]而非x_{a}表示,便于直接写成代码。

首先:

该算法的输入是离散的,连续的数据需要在预处理过程中处理成离散的。不需要“标准化”或“归一化”。

如图所示,可以简单的得到当然,如果有多个输入且每个输入有多种可能的情况,也可以通过下面的方法计算。

在了解下方的变量前,请确认:

1. 你有非常多的样本(即多组输入)

2. 你的每个样本(即每组输入)有一个或多个输入的值。

3. 你的每个输入的值(可能原本是连续的或离散的)已经被处理成离散的。换而言之每个输入的值只有有限种可能,而且种类可知,比如二分只有2种可能,0或1。

图中未标记任何变量,所有可能需要的变量如下:

1. i_num,你有的样本的个数。显然是整型

2. i_width,每个样本,输入的值的个数。显然是整型

3. i_depth[a],每个样本,第a个输入的值,可能的取值的数量。如果所有的值都是二分,就不需要这个变量。显然是整型

4. i[a][b],第a个样本,第b个值的取值。是整型

5. o_depth,每个样本,答案可能的取值的数量。如果答案的值是二分,就不需要这个变量。显然是整型

6. o[a],第a个样本对应的答案。是整型

7. Po[a],样本中答案为a的概率。是浮点型

8. Pio[a][b][c],答案值为c时,第a个输入值为b的概率,即P{输入[a]=b|输出=c}。是浮点型

9. Poi[a][b][c],第b个输入为c时,答案值为a的相对概率,即K * P{输出=c|输入[a]=b},是浮点型

学习:

1. 拷贝所有样本的输入到i中,拷贝所有样本的答案到o中。

2. 根据样本计算所有Po、Pio、Poi

        Po[a]=P\begin{Bmatrix} o=a \end{Bmatrix}

        Pio[a][b][c]=P\begin{Bmatrix} i[a]=b|o=c \end{Bmatrix}

        Poi[a][b][c]=Pio[b][c][a]*Po[a]

        (c\c++,计算概率只需要该情况数简单求和,再除总数即可,实在太简单不再多做介绍,另外,P\begin{Bmatrix} o=a|i[b]=c \end{Bmatrix}=\frac{P\begin{Bmatrix} o=a \end{Bmatrix}*P\begin{Bmatrix} i[b]=c|o=a \end{Bmatrix}}{P\begin{Bmatrix} i[b]=c \end{Bmatrix}},而P\begin{Bmatrix} i[b]=c \end{Bmatrix}可以当常数约去,不影响最后的大小比较,所以称Poi为相对概率,并非真实概率)

测试或使用:

学习结束后,只需保存Poi,即保存了学习结果,当然学习的样本与测试、使用的样本应该有相同的i_width、i_depth与o_depth(忘了这几个变量的含义看上方变量的意义)。

这里定义2个临时变量:

1. input[a],测试的一个样本中,第a个值的取值

2. tempP[a],根据input与Poi所得出,答案为a的相对概率。

然后

1. 拷贝输入的样本到input

2. 计算tempP:

        tempP[a]=\prod_{k=0}^{width}Poi[a][k][input[k]]

3. 找到最大的tempP,其下标即为输出的答案。

最后:

写的比较匆忙,很多地方没有检查,我本人学习这些算法的时间也很短,如果存在任何问题,有任何意见或建议欢迎指出,我会马上进行更正。

另外,要深入理解一种算法,其具体原理和推导过程也是需要学习的。网上有太多这方面的文章,在这就不做详细解释。

谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值