朴素贝叶斯的python代码实现

本文介绍了朴素贝叶斯分类的基本原理及应用实例,详细解释了贝叶斯定理及其在分类任务中的作用,并通过一个具体的例子展示了如何利用朴素贝叶斯算法进行分类。

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

朴素贝叶斯 (native Bayes) 是基于贝叶斯定理与特征条件独立假设的分类方法。

贝叶斯定理便是基于条件概率,通过P(A|B)来求P(B|A):

P(B|A)=P(A|B)P(B)P(A)

顺便提一下,上式中的分母P(A),可以根据全概率公式分解为:

P(A)=∑ni=P(Bi)P(A|Bi)

求出所有的后验概率,就可以得到问题的解
算法实现可以分类两个过程:

  • 对于给定的训练数据集,先经过基于特征条件独立假设学习输入\输出的联合概率密度;
  • 根据上一步计算的结果,对于给定的输入,利用Bayes定理求出后验概率,概率最大所对应的类别即为所求类别

例子,有如下训练数据,15个样本,2维特征X1,X2,2种类别-1,1。给定测试样本x=(2,S)T,判断其类别。

训练数据:
{‘x1’:[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],
‘x2’:[‘S’,’M’,’M’,’S’,’S’,’S’,’M’,’M’,’L’,’L’,’L’,’M’,’M’,’L’,’L’],
‘y’:[-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]}
解答如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Nov 12 10:53:22 2017

@author: mynumber
"""

import pandas as pd
#Fraction 可以用来表示分数
from fractions import Fraction
#计算条件概率的乘积
def fin_data1(data,x,y):
    column=data.columns
    column=column[0:len(column)-1]
    data_y=data[data['y'].isin([y])]
    p=1
    xi=0
    for word in column:
        x_set=x[xi]
        xi+=1
        data_y_x=data_y[data_y[word].isin([x_set])]          #统计有多少满足条件的数据
        p=p*Fraction(len(data_y_x),len(data_y))              #计算条件概率
    return p

#计算先验概率
def fin_data2(data,y):
    return   Fraction(len(data[data['y'].isin([y])]),len(data))

def answer(data,x):
    y_data=data['y'].unique()
    P=[]
    for i in y_data:          
        p1=fin_data2(data,i)*fin_data1(data,x,i)             #分别计算x被分到所有类别的概率
        P.append(p1)
        print('    y取%d时的概率为%s' %(i,P[i]))
    p_max=max(P)
    dx=P.index(p_max)
    print('概率最大值是:%s,对应的y值为%d'%(p_max,y_data[dx]))

#先验知识,使用DataFrame进行存储
data_dict={'x1':[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],
           'x2':['S','M','M','S','S','S','M','M','L','L','L','M','M','L','L'],
             'y':[-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]}
data=pd.DataFrame(data_dict)

#测试数据
x=(2,'S')
print('when input is ',x)
print('The answer are :')
answer(data,x)


#结果如下:
when input is  (2, 'S')
The answer are :
    y取-1时的概率为1/15
    y取1时的概率为1/45
概率最大值是:1/15,对应的y值为-1

参考文献:

  • 《统计学习方法》,李航
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值