实现机器学习的循序渐进指南III——朴素贝叶斯

目录

介绍

朴素贝叶斯模型

参数估计

分类

结论与分析


可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表。 

介绍

朴素贝叶斯是一种基于贝叶斯决策理论和特征条件独立性的分类,它基于训练集上的条件独立性作为检测模型来计算概率分布。对于给定的测试对象,后验概率的最大值的标签是测试对象的预测。最大化后验概率意味着最小化预期风险。那么另一个问题是为什么称它为朴素 ”贝叶斯?这是因为朴素贝叶斯遵循这样一个天真的假设:当标签被确定时所有分类特征都是独立的,由下式给出:

其中j是第i个特征,c kk-th标签。然后,贝叶斯分类器可以定义为:

 

那么为什么最大化后验概率意味着最小化预期风险呢?让损失是0-1损失函数

 

其中f(x) 是决策函数。然后,预期的风险是

这是从联合分布P(X,Y)计算的。因此条件期望是:

为了最大限度地降低预期风险,需要将每个风险降至最低X = x,即:

朴素贝叶斯模型

朴素贝叶斯模型由参数估计和分类组成。

参数估计

在训练过程中,学习意味着估计先验概率和条件概率。最大似然估计MLE)是获得上述参数的一般方法。先验概率的MLE由下式给出:

 

表示 j-th特征集是 a j1a j2...a jsi }。然后,条件概率的MLE由下式给出:

在朴素贝叶斯训练过程中,计算先验概率和条件概率。但是,如果在训练集中从未发生过特征的值,则其概率等于零,这将影响后验概率的结果。为了解决这个问题,我们引入拉普拉斯平滑在每个随机变量的频率上加一个整数

然后,先验概率的贝叶斯估计是:

 

其中N是唯一标签的数量,K即样本数量。先验概率代码如下所示:

prior_probability = {}
for key in range(len(label_value)):
  prior_probability[label_value[key][0]] = 
    (label_value[key][1] + self.laplace) / (N + K * self.laplace)  # laplace smooth
self.prior_probability = prior_probability

其中label_value (label, label_num)元组。

类似地,条件概率的贝叶斯估计是:

条件概率的代码如下所示。应用矩阵来保存条件概率,并且 S[j]j-th特征的唯一标签的数量。

# calculate the conditional probability
prob = []
# calculate the count (x = a & y = c)
for j in range(feature_dim):
    count = np.zeros([S[j], len(label_count)])  # the range of label start with 1
    feature_temp = train_data[:, j]
    feature_value_temp = feature_value[j]
    for i in range(len(feature_temp)):
        for k in range(len(feature_value_temp)):
            for t in range(len(label_count)):
                if feature_temp[i] == feature_value_temp[k]
                        and train_label[i] == label_value[t][0]:
                   count[k][t] += 1             # x = value and y = label
     # calculate the conditional probability
     for m in range(len(label_value)):
         count[:, m] = (count[:, m] + self.laplace) /
                 (label_value[m][1] + self.laplace*S[j])  # laplace smoothing
         # print(count)
    prob.append(count)
self.conditional_probability = prob

分类

在计算先验概率和条件概率之后,贝叶斯分类模型是:

分类代码如下所示。predict是一个包含每个标签概率的字典。然后我们只需要排序predict,预测是排序字典中的第一个元素。

def classify(self, sample):
    predict = {}
    for m in range(len(self.label_value)):
        temp = self.prior_probability
          [self.label_value[m][0]]  # get the prior_probability of m-th label in label_value
        for n in range(len(sample)):
            if sample[n] in self.feature_value[n]:
                # print(m, n)
                index = np.where(self.feature_value[n] == sample[n])[0][0]
                temp = temp * self.conditional_probability[n][index][m]
            else:
                temp = self.laplace /
                     (self.S[n] * self.laplace)  # if the value of feature is
                                    # not in training set, return the laplace smoothing
        predict[self.label_value[m][0]] = temp
    return predict

结论与分析

贝叶斯模型是本文的Berniulli贝叶斯模型。除此之外,还有其他贝叶斯模型,如高斯贝叶斯模型,多项式贝叶斯模型。最后,让我们将我们的贝叶斯模型与Sklearn中的贝叶斯模型进行比较,检测性能如下所示:

结果表明,这两种方法的检测效果都很差。此外,我们的贝叶斯模型需要更长的运行时间,这可能是条件概率的算法包含太多的循环。

可以在MachineLearning找到本文中的相关代码和数据集。

有兴趣的小伙伴可以查看上一篇或者下一篇

 

原文地址:https://www.codeproject.com/Articles/4051340/Step-by-Step-Guide-To-Implement-Machine-Learning-3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值