r - 使用日志来向量化重复乘法是正确的方法吗?

标签 r matlab machine-learning linear-algebra vectorization

我最近写了一个朴素贝叶斯的实现,将示例分为 5 个不同的组之一。特征的数量 n 非常大,每个特征都可以打开 (1) 或关闭 (0)。使用训练集,我针对每个特征 Fj 估计了每组 Gi 的条件概率的 5 × n 矩阵 P,其中 1≤i≤5, 1≤ j≤n,因此单元格 (i,j) = P(Gi=1|Fj=1)。 (我忽略了概率 P(Gi=1|Fj=0) 因为它们与本次讨论无关。)

我想做的是,给定一个新示例 E,一个 1 × n 向量,将矩阵 P 中与新示例中的特征对应的条件概率相乘。这样做我有两个顾虑:

  1. 大量的特征意味着循环会很慢
  2. 重复乘法可能会导致准确性下降

我所做的是取 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展开为F1..n给出

P(G=g|F1= f1, F2= f2... Fn= fn) = P(F1= f1, F2= f2... Fn= fn|G=g)P(G=g) / P(F= f )

应用独立特征的朴素假设

P(G=g|F1= f1, F2= f2... Fn= fn) = P(F1= f1|G=g) P(F2= f2|G=g) ... P(Fn= fn|G=g)P(G=g) / P(F= f )

分母可以去掉,因为它对所有的 g 都是一样的,所以我们有

P(G=g|F1= f1, F2= f2... Fn= fn) ∝ P(F1= f1|G=g) P(F2= f2|G=g) ... P(Fn= fn|G=g)P(G=g)

这里,P(G=g)是先验概率。

最佳答案

我假设您已经重写了 E P' 的乘法以处理您用 log(P) 表示 P 的事实?

用概率对数表示条件概率是一种非常常用的技术,可以解决它们可能变得非常小这一事实。

自动目标识别应用程序(例如 Dempster-Schafer)中许多稳健分类器的实现强制概率始终为非零。您所提议的是实现这一目标的另一种方式。

关于r - 使用日志来向量化重复乘法是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17030793/

相关文章:

arrays - 向量化涉及循环中的 while 循环或 if 子句的函数 (Matlab)

machine-learning - 预测一段时间内的客户流失

matlab - 如何使用矩阵作为输入来训练 Matlab 神经网络?

r - 在循环中覆盖 "Non-Existent Components"

r - glmnet 如何计算最大 lambda 值?

r - 匹配。使用 MatchIt 和 Matching 进行数据模拟和估计。如何检索真实模型?

圆柱轴上的 Matlab 3D 图

r - 在 for 循环中在 mac 上设置多个内核

algorithm - 我怎样才能在我的 matlab 脚本中拦截这个近似错误?

python - scipy 中的 kmeans 和 kmeans2 有什么区别?