我最近编写了一个朴素贝叶斯的实现,将示例分为 5 个不同的组之一。特征的数量 n 非常大,每个特征可以是 on (1) 或 off (0)。使用训练集,我估计了每个组 G i针对每个特征 F j的条件概率的 5 × n 矩阵 P ,对于 1≤i≤5, 1≤j≤n,因此单元格 (i,j) = P (G i =1|F j =1)。(我忽略了概率 P(G i =1|F j =0),因为它们与本次讨论无关。)
我想做的是,给定一个新示例 E,一个 1 × n 向量,将矩阵 P 中对应于新示例中的特征的条件概率相乘。我这样做有两个顾虑:
- 非常多的功能意味着循环会很慢
- 重复乘法可能导致精度损失
我所做的是取 P 的对数,L=log(P),然后执行矩阵乘法 E L'。乘法给出 1 × 5 的结果,结果的最大值表示哪个组,假设先验概率大致相等。这通过矢量化解决了速度问题,并通过取对数(当然,取对数将乘法转换为加法)解决了准确性问题。另一个优点是 E L' 适用于 E 是矩阵而不是向量的一组训练示例。
我的问题是,采用这样的日志是一种合理/标准的方法吗?看起来这可能是显而易见的“101”方法,但我在实现这样的算法方面经验有限,所以我希望有更多经验的人提供反馈。
作为参考,在朴素贝叶斯方法中,贝叶斯定理给出了以特征F = f为条件的在组 g 中的概率
P(G=g| F = f )=P( F = f |G=g)P(G=g)/P( F = f )
将特征向量F扩展为 F 1..n给出
P(G=g|F 1 = f 1 , F 2 = f 2 ... F n = f n ) = P(F 1 = f 1 , F 2 = f 2 ... F n = f n |G =g)P(G=g)/P( F = f )
应用独立特征的朴素假设
P(G=g|F 1 = f 1 , F 2 = f 2 ... F n = f n ) = P(F 1 = f 1 |G=g) P(F 2 = f 2 |G=g ) ... P(F n = f n |G=g)P(G=g) / P( F = f )
分母可以去掉,因为它对所有 g 都是一样的,所以我们有
P(G=g|F 1 = f 1 , F 2 = f 2 ... F n = f n ) ∝ P(F 1 = f 1 |G=g) P(F 2 = f 2 |G=g ) ... P(F n = f n |G=g)P(G=g)
这里,P(G=g) 是先验概率。