朴素贝叶斯不调包超详细python代码实现

博客介绍了朴素贝叶斯的种类,包括高斯、多项式、伯努利分布的朴素贝叶斯,并给出了相应公式。还展示了高斯朴素贝叶斯的Python代码实现,涉及相关数据示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

朴素贝叶斯种类

  • GaussianNB:高斯朴素贝叶斯就是先验为高斯分布(正态分布)的朴素贝叶斯。公式为:

    P(Xj=xj∣Y=Ck)=12πσk2exp⁡(−(xj−μk)22σk2)P\left(X_{j}=x_{j} | Y=C_{k}\right)=\frac{1}{\sqrt{2 \pi \sigma_{k}^{2}}} \exp \left(-\frac{\left(x_{j}-\mu_{k}\right)^{2}}{2 \sigma_{k}^{2}}\right)P(Xj=xjY=Ck)=2πσk21exp(2σk2(xjμk)2)

  • MultinomialNB就是先验为多项式分布的朴素贝叶斯,例如某个特征表示某个词语出现的次数。公式为
    P(Xj=xjl∣Y=Ck)=xjl+λmk+nλ P\left(X_{j}=x_{j l} | Y=C_{k}\right)=\frac{x_{j l}+\lambda}{m_{k}+n \lambda} P(Xj=xjlY=Ck)=mk+nλxjl+λ

  • BernoulliNB就是先验为伯努利分布的朴素贝叶斯。假设特征的先验概率为二元伯努利分布,即如下式:
    P(Xj=xjl∣Y=Ck)=P(j∣Y=Ck)xjl+(1−P(j∣Y=Ck)(1−xjl)P\left(X_{j}=x_{j l} | Y=C_{k}\right)=P\left(j | Y=C_{k}\right) x_{j l}+\left(1-P\left(j | Y=C_{k}\right)\left(1-x_{j l}\right)\right.P(Xj=xjlY=Ck)=P(jY=Ck)xjl+(1P(jY=Ck)(1xjl)

      - 一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。
     
      - 如果如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适。
     
      - 而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。
    

2.高斯朴素贝叶斯python代码实现

主要代码:

def gnb_classify(train,test):
    labels = train.iloc[:,-1].value_counts().index #提取训练集的标签种类
    mean =[] #存放每个类别的均值
    std =[] #存放每个类别的方差
    result = [] #存放测试集的预测结果
    for i in labels:  # labels:['Iris-versicolor', 'Iris-virginica', 'Iris-setosa']
        item = train.loc[train.iloc[:,-1]==i,:] #分别提取出每一种类别
        m = item.iloc[:,:-1].mean() #当前类别的平均值
        s = np.sum((item.iloc[:,:-1]-m)**2)/(item.shape[0]) #当前类别的方差
        mean.append(m) #将当前类别的平均值追加至列表
        std.append(s) #将当前类别的方差追加至列表
    means = pd.DataFrame(mean,index=labels) #变成DF格式,索引为类标签
    stds = pd.DataFrame(std,index=labels) #变成DF格式,索引为类标签
    for j in range(test.shape[0]):
        iset = test.iloc[j,:-1].tolist() #当前测试实例
        iprob = np.exp(-((iset-means)**2)/(2 * stds**2))/(stds * np.sqrt(2 * np.pi)) #正态分布公式
        prob = 1 #初始化当前实例总概率
        for k in range(test.shape[1]-1): #遍历每个特征
            prob *= iprob[k] #特征概率之积即为当前实例概率
        cla = prob.index[np.argmax(prob.values)] #返回最大概率的类别
        result.append(cla)
    test['predict']=result
    acc = (test.iloc[:,-1]==test.iloc[:,-2]).mean() #计算预测准确率
    print(f'模型预测准确率为{acc}')

数据demo:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值