机器学习:朴素贝叶斯代码实现(不调库,基于《统计学习方法》中的简单数据)

什么是朴素贝叶斯:

  1. 《统计学习方法》中,李航老师简洁地介绍了朴素贝叶斯基础的原理和算法
    虽然通篇下来也是满满的公式,但基本都是上层的公式,省略了许多底层的推导
    例如:极大似然估计法推出朴素贝叶斯法中的先验概率估计公式?
    总的来说对新手十分友好,建议入门之选。

  2. 朴素”一词,到底是何意思?
    在贝叶斯公式的基础上,朴素贝叶斯方法做了一个强假设,对于一个结果的发生(y
    导致其发生的因素为x ( x = (x1, x2, …, xn)), 我们认为其中x1,…,xn是n个互相独立的小事件
    也就是每一个都对y的发生有影响,但他们之间却相互无影响。
    在这里插入图片描述

贝叶斯估计 和 极大似然估计:

对于大多数初学者,基本都会对贝叶斯产生理解上的困惑

如果你觉得又臭又长不想看,我简单通俗说明一下他们之间思想的不同之处:

  • 首先你要明白,朴素贝叶斯法 和 贝叶斯估计 是两个不同的东西
    贝叶斯估计 和 极大似然估计 都是 朴素贝叶斯法 中用来计算先验概率的方法
    极大似然估计:简单来说就是中学阶段接触的简单概率,一枚硬币抛100次,40次向上,我们就认为此硬币抛出向上的概率为2/5,因为这个概率是最支持当前结果的(极大似然的核心思想),于是你可以发现,极大似然法得到的参数是完全被数据所支配的。而概率这种东西,总是会有偏差的。
    下图是极大似然估计的先验概率
    在这里插入图片描述
    贝叶斯估计:如之前所说,任何数据集,总是带有片面性的,不全面的。所以最终参数总是存在偏差的,不能把最支持对当前结果的模型作为当前事件的概率模型,于是贝叶斯估计中认为参数是变化的而不是固定的。回忆一下贝叶斯公式,它是用来计算后验概率的,也就是已知结果求其导致原因的概率。该公式的结果取决于两方面:似然估计和先验概率。正是如此,我们最终的估计结果才更加客观合理地反映模型的参数。对于上面抛硬币的例子,贝叶斯估计的概率也或许就变成是(2 + N)/ (5 + M)
    下图是贝叶斯估计的先验概率
    在这里插入图片描述

代码实现:(使用极大似然估计)

对于以下数据的简单代码实现,但不仅限于此数据,扩展以下数据,使其变成多分类,增大数据量,依然可以用本代码来进行预测。

在这里插入图片描述

分步解析
  1. 数据量比较小,就直接手动输入了,用字典来存储先验概率,便于后续计算时的调用

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 = {
   }

  1. 统计y的种类及数量,用于后续计算
    使该二维分类器不局限于两种类(y),接下来先统计y的种类,并计算P(Y=c)的先验概率,再切分训练数据
    计算先验概率并对应y值存入字典,然后根据不同的y切分数据,各自存入一个列表,这些列表存于字典ys
   
    def train_1(self):
        count_y = Counter(
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值