根据名字判断性别有一个朴素贝叶斯教程(http://sofasofa.io/tutorials/naive_bayes_classifier/),但是关于其中Laplace平滑我有一个疑问。
教程作者首先统计了两个性别中,每个字出现的概率。由于最后计算后验概率时需要有公共的部分,因此作者又计算了该公共部分,即如下代码:
base_f = math.log(1 - train['gender'].mean())
base_f += sum([math.log(1 - frequency_list_f[char]) for char in frequency_list_m])
base_m = math.log(train['gender'].mean())
base_m += sum([math.log(1 - frequency_list_m[char]) for char in frequency_list_m])
为了避免新名字中某些字出现的概率变为0,采用了Laplace平滑。即在测试集中,在计算每个字的概率时使用了Laplace平滑。但是在计算base_f和base_m时,作者却并没有用到Laplace平滑。
我认为Laplace平滑应该在计算base_f和base_m时也应该用吧?
1个回答
不需要吧,教程里的平滑是对词频进行平滑,而base_f和base_m就是训练集中男女的性别比重,不涉及到词频
你这么说也有道理。确实,在base_f和base_m中,计算的是训练集中的比例,因此不会出现某个字概率为0的情况,不会对取log造成影响。不过在李航的《统计学习方法》中,利用贝叶斯估计的例题中(例4.2),在计算训练集中的条件概率时,也用到了Laplace平滑。这个问题可能还需要探讨吧
-
CharlieGuo
2018-04-18 16:17