什么是朴素贝叶斯:
-
《统计学习方法》中,李航老师简洁地介绍了朴素贝叶斯基础的原理和算法
虽然通篇下来也是满满的公式,但基本都是上层的公式,省略了许多底层的推导
例如:极大似然估计法推出朴素贝叶斯法中的先验概率估计公式?
总的来说对新手十分友好,建议入门之选。 -
“朴素”一词,到底是何意思?
在贝叶斯公式的基础上,朴素贝叶斯方法做了一个强假设,对于一个结果的发生(y)
导致其发生的因素为x ( x = (x1, x2, …, xn)), 我们认为其中x1,…,xn是n个互相独立的小事件
也就是每一个都对y的发生有影响,但他们之间却相互无影响。
贝叶斯估计 和 极大似然估计:
对于大多数初学者,基本都会对贝叶斯产生理解上的困惑
- 这里放一篇文章,从数学角度详细解释了两者的原理:贝叶斯估计、最大似然估计、最大后验概率估计
如果你觉得又臭又长不想看,我简单通俗说明一下他们之间思想的不同之处:
- 首先你要明白,朴素贝叶斯法 和 贝叶斯估计 是两个不同的东西
贝叶斯估计 和 极大似然估计 都是 朴素贝叶斯法 中用来计算先验概率的方法
极大似然估计:简单来说就是中学阶段接触的简单概率,一枚硬币抛100次,40次向上,我们就认为此硬币抛出向上的概率为2/5,因为这个概率是最支持当前结果的(极大似然的核心思想),于是你可以发现,极大似然法得到的参数是完全被数据所支配的。而概率这种东西,总是会有偏差的。
下图是极大似然估计的先验概率
贝叶斯估计:如之前所说,任何数据集,总是带有片面性的,不全面的。所以最终参数总是存在偏差的,不能把最支持对当前结果的模型作为当前事件的概率模型,于是贝叶斯估计中认为参数是变化的而不是固定的。回忆一下贝叶斯公式,它是用来计算后验概率的,也就是已知结果求其导致原因的概率。该公式的结果取决于两方面:似然估计和先验概率。正是如此,我们最终的估计结果才更加客观合理地反映模型的参数。对于上面抛硬币的例子,贝叶斯估计的概率也或许就变成是(2 + N)/ (5 + M)
下图是贝叶斯估计的先验概率
代码实现:(使用极大似然估计)
对于以下数据的简单代码实现,但不仅限于此数据,扩展以下数据,使其变成多分类,增大数据量,依然可以用本代码来进行预测。
分步解析
- 数据量比较小,就直接手动输入了,用字典来存储先验概率,便于后续计算时的调用
class Bayes:
def __init__(self):
self.t_data = np.array([[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],
['S', 'M', 'M', 'S', 'S', 'S', 'M', 'M', 'L', 'L', 'L', 'M', 'M', 'L', 'L'],
[-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]])
self.p_y = {
}
self.p_x1_y = {
}
self.p_x2_y = {
}
- 统计y的种类及数量,用于后续计算
使该二维分类器不局限于两种类(y),接下来先统计y的种类,并计算P(Y=c)的先验概率,再切分训练数据
计算先验概率并对应y值存入字典,然后根据不同的y切分数据,各自存入一个列表,这些列表存于字典ys
def train_1(self):
count_y = Counter(